From 53b33bb3cb2efa85bc41e59eb86b8efdea7c64f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez?= Date: Fri, 24 Apr 2020 22:29:04 +0200 Subject: [PATCH 01/26] [Logs UI] View log in context modal (#62198) --- docs/logs/images/logs-action-menu.png | Bin 0 -> 531 bytes docs/logs/images/logs-view-in-context.png | Bin 0 -> 388396 bytes docs/logs/using.asciidoc | 11 +- .../common/http_api/log_entries/entries.ts | 10 +- .../log_entry_actions_column.tsx | 34 ++++- .../logging/log_text_stream/log_entry_row.tsx | 42 ++++-- .../scrollable_log_text_stream_view.tsx | 37 +++++- .../logging/log_text_stream/text_styles.tsx | 2 +- .../logs/view_log_in_context/index.ts | 7 + .../view_log_in_context.ts | 83 ++++++++++++ .../infra/public/pages/logs/stream/page.tsx | 2 + .../pages/logs/stream/page_logs_content.tsx | 5 + .../pages/logs/stream/page_providers.tsx | 32 ++++- .../logs/stream/page_view_log_in_context.tsx | 124 ++++++++++++++++++ .../public/utils/use_viewport_dimensions.ts | 39 ++++++ .../log_entries_domain/log_entries_domain.ts | 26 ++-- .../api_integration/apis/infra/log_entries.ts | 6 +- 17 files changed, 414 insertions(+), 46 deletions(-) create mode 100644 docs/logs/images/logs-action-menu.png create mode 100644 docs/logs/images/logs-view-in-context.png create mode 100644 x-pack/plugins/infra/public/containers/logs/view_log_in_context/index.ts create mode 100644 x-pack/plugins/infra/public/containers/logs/view_log_in_context/view_log_in_context.ts create mode 100644 x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx create mode 100644 x-pack/plugins/infra/public/utils/use_viewport_dimensions.ts diff --git a/docs/logs/images/logs-action-menu.png b/docs/logs/images/logs-action-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..f1c79b6fa88d1408df35ac7eaaf5cc2d1e965d0c GIT binary patch literal 531 zcmV+u0_^>XP)X0{{R39Q7V=0002VP)t-sAyuFM z|NkRapCMMCC0L*$R-YtRpYihd5m22(Xs0AspB7P_J!GXSTA^o&yE|&DPj9O6^Z5S% z|J~;B|Nj19gt)ZD-6~n3+T-u;@b-O~!vI2GCUKrXEtA zH)p9NSfIAY-X2<`BUPT>=JBbz)&N78gPq0)Oq%cU_9j`OD_NnYxz+$hm^@>pHejOw zM3?|aoBjU&07{xAUZo~jpdVA6BwnQ;Q=J@AogY)47gC-8OPc=v{_@6Z0ssI31xZ9f zRCr!>Qq_(GF$_y-n3kEDnfdZ+NoA1pOi(z*^1#1A3GYOdSsb#v9CJR(p? zXUV8sugq!ywOOTJ9+7NX3P}0W+9+_rnBWCtea#ar0yeJp7hf=Vg9-n(Uttjrq~BD_k$kT7A)Ut!O6S_Y(*LeL51HUiP4FTU{LB2RW`2^H>$gO^SHA*b VCJhtj8HxY^002ovPDHLkV1j5E_D28! literal 0 HcmV?d00001 diff --git a/docs/logs/images/logs-view-in-context.png b/docs/logs/images/logs-view-in-context.png new file mode 100644 index 0000000000000000000000000000000000000000..09a9e89fc30429072106b73b6e15fa84aef38325 GIT binary patch literal 388396 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 z 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�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

`>Vhgy3Vv1HBeu8p$*{vpJ!>?JJ3sC2Mlf~G z;ex=cIy2hPMY%rN)Y2I-Y|B`A6Q&QYw&|uc;Ui6!HUU92)a}^EuU~#38g0I`@D=@> z^*9gt#49YZUHNeqME%KIQDj4yrbv(etMQt)Ha93m}j3FSeejc(R|&A>1t=dEGwR0}$hajHrmm=BT*f+y^B2T1$fUf=DK2~OCv z)}@Cps1!MA1>bnDUp)Pxy8_RtkKS@9t6XBXtX?%$YW5ECb+C$VqA)f4fjDZn1oM46 zXU-ccCqeoVPexbn>NFY4{rvdB?BwaaG}6xDjO@T?M6pbq>wF$DraQTRji%%j8T7Pcn{=?GcmkuXcxipj4fhJpN$>S+l-!g@VWc*6 zo+b0qsiJpFpB(ZMSnm}0l#1subvivSWqOWwn%)U8`N~?|aFnr`@v)I7@?y9A|GoU!Cvb z#@I>~rhjY%;f&ncsHyJn8scATkHM`Iw1uJW+HO;cCV!liP(*@g=h2I1PTlx3@f#MAn67IG z>^apsE2TchNR$CAR(kSDu)=Z!5;OtVD@$d2Ul>d|-@vStH0Fg$^?;3vPz>hP83x=h zY0(R6OfqLYqDzWCj5P5@SUGJPM3g*J#J_EY@E-qh{2pA{Uut?S>#^7)36H_2S@g&` z^5*$5*8@)`Hcs#EVXd0uZ%hdyft$R3NKtJ0p1f;cFndz?Ct0Gr6I(S*&023>&pOL{ z$V*S7&T7eY5UMJ?NI9@V-8KPHSr0;p;+ZncC0#F2wB7KQ{_)0(5}mBGANuW=V@caa znu7gg6@?D=3y1ABCu4gGPY8lMzDd;eqj29NyW&1!k;!k@_hg=|^Kf+qzFU@a#Y7+8 zGsv)6)0^TVq2-arl^&#rIJvi#7glBfk))d&bVtOyZ|;VOGNZD3?3V|A>b%NgJIv5C zx%&$L=6f(gFSTiz9rV>x>b9WWhtKws4*_Ja=^sv5TFF`0lwZoZLH5r^+CB^B9F(Y{ zkUZY>g4uWu7~aR3HiUHkBE{<6S@(nKG0@RI0K%u0SP?Aq-*}k$n{RVeiy>TIXBq9u zm)o}@rv6m!(3`UaZm@r_eama*g)56FkD;aF*zod5{V#x(kGPMG2WW} zc$+KwEljA!C>0zo?)v7NB7RZ)SlwQ)kh=;hAc_z>^MIy4iuGqoG>-Y(PP{?M-zUds! zPi)we>X0ej8hH|2dpvb7$OhJSY4Rp{y5+!b?YWhE%L{>`a{+hDf$nDzs7~xGLlf{1 z*+7>qopZBqjxZE|K2cWT%asEOEW2-ac6!(-j{RH=dcU-7FzHkAbDQ#}?L07|HF^Gb z%C)J-L;HtY%EoD#byMpWEEoR8mq4IuG0^wu*15#{1?6qY=^#{=mp%fMqothShYLMX zF>gdWp8nq;-2Y9o1}0D*k_qQ{!64LS(3gl#_d%7;kO2UW!Kt18_aXdUCy08E>wJZE Tym;5uzgLC^X8MGiPEr2{zfWU{ literal 0 HcmV?d00001 diff --git a/docs/logs/using.asciidoc b/docs/logs/using.asciidoc index 96e7c5fa4d312..4f5992f945c7a 100644 --- a/docs/logs/using.asciidoc +++ b/docs/logs/using.asciidoc @@ -69,12 +69,19 @@ To highlight a word or phrase in the logs stream, click *Highlights* and enter y [float] [[logs-event-inspector]] === Inspect a log event -To inspect a log event, hover over it, then click the *View details* icon image:logs/images/logs-view-event.png[View event icon] beside the event. -This opens the *Log event document details* fly-out that shows the fields associated with the log event. +To inspect a log event, hover over it, then click the *View actions for line* icon image:logs/images/logs-action-menu.png[View actions for line icon]. On the menu that opens, select *View details*. This opens the *Log event document details* fly-out that shows the fields associated with the log event. To quickly filter the logs stream by one of the field values, in the log event details, click the *View event with filter* icon image:logs/images/logs-view-event-with-filter.png[View event icon] beside the field. This automatically adds a search filter to the logs stream to filter the entries by this field and value. +[float] +[[log-view-in-context]] +=== View log line in context +To view a certain line in its context (for example, with other log lines from the same file, or the same cloud container), hover over it, then click the *View actions for line* image:logs/images/logs-action-menu.png[View actions for line icon]. On the menu that opens, select *View in context*. This opens the *View log in context* modal, that shows the log line in its context. + +[role="screenshot"] +image::logs/images/logs-view-in-context.png[View a log line in context] + [float] [[view-log-anomalies]] === View log anomalies diff --git a/x-pack/plugins/infra/common/http_api/log_entries/entries.ts b/x-pack/plugins/infra/common/http_api/log_entries/entries.ts index d532c079e3e9c..1c5a2f0fe1ad9 100644 --- a/x-pack/plugins/infra/common/http_api/log_entries/entries.ts +++ b/x-pack/plugins/infra/common/http_api/log_entries/entries.ts @@ -78,11 +78,11 @@ export const logEntryRT = rt.type({ id: rt.string, cursor: logEntriesCursorRT, columns: rt.array(logColumnRT), - context: rt.partial({ - 'log.file.path': rt.string, - 'host.name': rt.string, - 'container.id': rt.string, - }), + context: rt.union([ + rt.type({}), + rt.type({ 'container.id': rt.string }), + rt.type({ 'host.name': rt.string, 'log.file.path': rt.string }), + ]), }); export type LogMessageConstantPart = rt.TypeOf; diff --git a/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_actions_column.tsx b/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_actions_column.tsx index e02346c4e758a..976e4165eb6d5 100644 --- a/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_actions_column.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_actions_column.tsx @@ -24,29 +24,49 @@ interface LogEntryActionsColumnProps { isMenuOpen: boolean; onOpenMenu: () => void; onCloseMenu: () => void; - onViewDetails: () => void; + onViewDetails?: () => void; + onViewLogInContext?: () => void; } const MENU_LABEL = i18n.translate('xpack.infra.logEntryItemView.logEntryActionsMenuToolTip', { - defaultMessage: 'View Details', + defaultMessage: 'View actions for line', }); const LOG_DETAILS_LABEL = i18n.translate('xpack.infra.logs.logEntryActionsDetailsButton', { - defaultMessage: 'View actions for line', + defaultMessage: 'View details', }); +const LOG_VIEW_IN_CONTEXT_LABEL = i18n.translate( + 'xpack.infra.lobs.logEntryActionsViewInContextButton', + { + defaultMessage: 'View in context', + } +); + export const LogEntryActionsColumn: React.FC = ({ isHovered, isMenuOpen, onOpenMenu, onCloseMenu, onViewDetails, + onViewLogInContext, }) => { const handleClickViewDetails = useCallback(() => { onCloseMenu(); - onViewDetails(); + + // Function might be `undefined` and the linter doesn't like that. + // eslint-disable-next-line no-unused-expressions + onViewDetails?.(); }, [onCloseMenu, onViewDetails]); + const handleClickViewInContext = useCallback(() => { + onCloseMenu(); + + // Function might be `undefined` and the linter doesn't like that. + // eslint-disable-next-line no-unused-expressions + onViewLogInContext?.(); + }, [onCloseMenu, onViewLogInContext]); + const button = ( = ({ + {onViewLogInContext !== undefined ? ( + + ) : null} diff --git a/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_row.tsx b/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_row.tsx index 7d7df796d13ad..5c20df000ae51 100644 --- a/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_row.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_row.tsx @@ -5,6 +5,7 @@ */ import React, { memo, useState, useCallback, useMemo } from 'react'; +import { isEmpty } from 'lodash'; import { euiStyled } from '../../../../../observability/public'; import { isTimestampColumn } from '../../../utils/log_entry'; @@ -32,6 +33,7 @@ interface LogEntryRowProps { isHighlighted: boolean; logEntry: LogEntry; openFlyoutWithItem?: (id: string) => void; + openViewLogInContext?: (entry: LogEntry) => void; scale: TextScale; wrap: boolean; } @@ -46,6 +48,7 @@ export const LogEntryRow = memo( isHighlighted, logEntry, openFlyoutWithItem, + openViewLogInContext, scale, wrap, }: LogEntryRowProps) => { @@ -63,6 +66,16 @@ export const LogEntryRow = memo( logEntry.id, ]); + const handleOpenViewLogInContext = useCallback(() => openViewLogInContext?.(logEntry), [ + openViewLogInContext, + logEntry, + ]); + + const hasContext = useMemo(() => !isEmpty(logEntry.context), [logEntry]); + const hasActionFlyoutWithItem = openFlyoutWithItem !== undefined; + const hasActionViewLogInContext = hasContext && openViewLogInContext !== undefined; + const hasActionsMenu = hasActionFlyoutWithItem || hasActionViewLogInContext; + const logEntryColumnsById = useMemo( () => logEntry.columns.reduce<{ @@ -165,18 +178,23 @@ export const LogEntryRow = memo( ); } })} - - - + {hasActionsMenu ? ( + + + + ) : null} ); } diff --git a/x-pack/plugins/infra/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx b/x-pack/plugins/infra/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx index 2c389b47fa6cf..f89aaf12db1bc 100644 --- a/x-pack/plugins/infra/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx @@ -26,6 +26,7 @@ import { MeasurableItemView } from './measurable_item_view'; import { VerticalScrollPanel } from './vertical_scroll_panel'; import { useColumnWidths, LogEntryColumnWidths } from './log_entry_column'; import { LogDateRow } from './log_date_row'; +import { LogEntry } from '../../../../common/http_api'; interface ScrollableLogTextStreamViewProps { columnConfigurations: LogColumnConfiguration[]; @@ -50,8 +51,9 @@ interface ScrollableLogTextStreamViewProps { }) => any; loadNewerItems: () => void; reloadItems: () => void; - setFlyoutItem: (id: string) => void; - setFlyoutVisibility: (visible: boolean) => void; + setFlyoutItem?: (id: string) => void; + setFlyoutVisibility?: (visible: boolean) => void; + setContextEntry?: (entry: LogEntry) => void; highlightedItem: string | null; currentHighlightKey: UniqueTimeKey | null; startDateExpression: string; @@ -140,9 +142,16 @@ export class ScrollableLogTextStreamView extends React.PureComponent< lastLoadedTime, updateDateRange, startLiveStreaming, + setFlyoutItem, + setFlyoutVisibility, + setContextEntry, } = this.props; + const { targetId, items, isScrollLocked } = this.state; const hasItems = items.length > 0; + const hasFlyoutAction = !!(setFlyoutItem && setFlyoutVisibility); + const hasContextAction = !!setContextEntry; + return ( {isReloading && (!isStreaming || !hasItems) ? ( @@ -227,7 +236,14 @@ export class ScrollableLogTextStreamView extends React.PureComponent< { - this.props.setFlyoutItem(id); - this.props.setFlyoutVisibility(true); + const { setFlyoutItem, setFlyoutVisibility } = this.props; + + if (setFlyoutItem && setFlyoutVisibility) { + setFlyoutItem(id); + setFlyoutVisibility(true); + } + }; + + private handleOpenViewLogInContext = (entry: LogEntry) => { + const { setContextEntry } = this.props; + if (setContextEntry) { + setContextEntry(entry); + } }; private handleReload = () => { diff --git a/x-pack/plugins/infra/public/components/logging/log_text_stream/text_styles.tsx b/x-pack/plugins/infra/public/components/logging/log_text_stream/text_styles.tsx index 69a6abbca4b34..0eb6140c0de84 100644 --- a/x-pack/plugins/infra/public/components/logging/log_text_stream/text_styles.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_text_stream/text_styles.tsx @@ -33,7 +33,7 @@ export const hoveredContentStyle = css` `; export const highlightedContentStyle = css` - background-color: ${props => props.theme.eui.euiFocusBackgroundColor}; + background-color: ${props => props.theme.eui.euiColorHighlight}; `; export const longWrappedContentStyle = css` diff --git a/x-pack/plugins/infra/public/containers/logs/view_log_in_context/index.ts b/x-pack/plugins/infra/public/containers/logs/view_log_in_context/index.ts new file mode 100644 index 0000000000000..0110c55c7c556 --- /dev/null +++ b/x-pack/plugins/infra/public/containers/logs/view_log_in_context/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export * from './view_log_in_context'; diff --git a/x-pack/plugins/infra/public/containers/logs/view_log_in_context/view_log_in_context.ts b/x-pack/plugins/infra/public/containers/logs/view_log_in_context/view_log_in_context.ts new file mode 100644 index 0000000000000..bc719cbd694e4 --- /dev/null +++ b/x-pack/plugins/infra/public/containers/logs/view_log_in_context/view_log_in_context.ts @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { useState, useEffect, useCallback } from 'react'; +import createContainer from 'constate'; +import { LogEntry } from '../../../../common/http_api'; +import { fetchLogEntries } from '../log_entries/api/fetch_log_entries'; +import { esKuery } from '../../../../../../../src/plugins/data/public'; + +function getQueryFromLogEntry(entry: LogEntry) { + const expression = Object.entries(entry.context).reduce((kuery, [key, value]) => { + const currentExpression = `${key} : "${value}"`; + if (kuery.length > 0) { + return `${kuery} AND ${currentExpression}`; + } else { + return currentExpression; + } + }, ''); + + return JSON.stringify(esKuery.toElasticsearchQuery(esKuery.fromKueryExpression(expression))); +} + +interface ViewLogInContextProps { + sourceId: string; + startTimestamp: number; + endTimestamp: number; +} + +export interface ViewLogInContextState { + entries: LogEntry[]; + isLoading: boolean; + contextEntry?: LogEntry; +} + +interface ViewLogInContextCallbacks { + setContextEntry: (entry?: LogEntry) => void; +} + +export const useViewLogInContext = ( + props: ViewLogInContextProps +): [ViewLogInContextState, ViewLogInContextCallbacks] => { + const [contextEntry, setContextEntry] = useState(); + const [entries, setEntries] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const { startTimestamp, endTimestamp, sourceId } = props; + + const maybeFetchLogs = useCallback(async () => { + if (contextEntry) { + setIsLoading(true); + const { data } = await fetchLogEntries({ + sourceId, + startTimestamp, + endTimestamp, + center: contextEntry.cursor, + query: getQueryFromLogEntry(contextEntry), + }); + setEntries(data.entries); + setIsLoading(false); + } else { + setEntries([]); + setIsLoading(false); + } + }, [contextEntry, startTimestamp, endTimestamp, sourceId]); + + useEffect(() => { + maybeFetchLogs(); + }, [maybeFetchLogs]); + + return [ + { + contextEntry, + entries, + isLoading, + }, + { + setContextEntry, + }, + ]; +}; + +export const ViewLogInContext = createContainer(useViewLogInContext); diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page.tsx index 3e07dcebf112d..aff0ac27c36f8 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page.tsx @@ -10,6 +10,7 @@ import { ColumnarPage } from '../../../components/page'; import { StreamPageContent } from './page_content'; import { StreamPageHeader } from './page_header'; import { LogsPageProviders } from './page_providers'; +import { PageViewLogInContext } from './page_view_log_in_context'; import { useTrackPageview } from '../../../../../observability/public'; export const StreamPage = () => { @@ -21,6 +22,7 @@ export const StreamPage = () => { + ); }; diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_logs_content.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_logs_content.tsx index b6061203a1c72..3208ea2402950 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_logs_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_logs_content.tsx @@ -27,6 +27,7 @@ import { Source } from '../../../containers/source'; import { LogsToolbar } from './page_toolbar'; import { LogHighlightsState } from '../../../containers/logs/log_highlights'; +import { ViewLogInContext } from '../../../containers/logs/view_log_in_context'; export const LogsPageLogsContent: React.FunctionComponent = () => { const { source, sourceId, version } = useContext(Source.Context); @@ -55,6 +56,9 @@ export const LogsPageLogsContent: React.FunctionComponent = () => { endDateExpression, updateDateRange, } = useContext(LogPositionState.Context); + + const [, { setContextEntry }] = useContext(ViewLogInContext.Context); + return ( <> @@ -104,6 +108,7 @@ export const LogsPageLogsContent: React.FunctionComponent = () => { wrap={textWrap} setFlyoutItem={setFlyoutId} setFlyoutVisibility={setFlyoutVisibility} + setContextEntry={setContextEntry} highlightedItem={surroundingLogsId ? surroundingLogsId : null} currentHighlightKey={currentHighlightKey} startDateExpression={startDateExpression} diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_providers.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_providers.tsx index e4ccdaf7c5748..0341dc7c35b33 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_providers.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_providers.tsx @@ -14,6 +14,7 @@ import { LogFilterState, WithLogFilterUrlState } from '../../../containers/logs/ import { LogEntriesState } from '../../../containers/logs/log_entries'; import { Source } from '../../../containers/source'; +import { ViewLogInContext } from '../../../containers/logs/view_log_in_context'; const LogFilterStateProvider: React.FC = ({ children }) => { const { createDerivedIndexPattern } = useContext(Source.Context); @@ -26,6 +27,25 @@ const LogFilterStateProvider: React.FC = ({ children }) => { ); }; +const ViewLogInContextProvider: React.FC = ({ children }) => { + const { startTimestamp, endTimestamp } = useContext(LogPositionState.Context); + const { sourceId } = useContext(Source.Context); + + if (!startTimestamp || !endTimestamp) { + return null; + } + + return ( + + {children} + + ); +}; + const LogEntriesStateProvider: React.FC = ({ children }) => { const { sourceId } = useContext(Source.Context); const { @@ -91,11 +111,13 @@ export const LogsPageProviders: React.FunctionComponent = ({ children }) => { - - - {children} - - + + + + {children} + + + diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx new file mode 100644 index 0000000000000..fdfc16d6a9bef --- /dev/null +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx @@ -0,0 +1,124 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useContext, useCallback, useMemo } from 'react'; +import { noop } from 'lodash'; +import { + EuiOverlayMask, + EuiModal, + EuiModalBody, + EuiText, + EuiTextColor, + EuiFlexGroup, + EuiFlexItem, + EuiToolTip, +} from '@elastic/eui'; +import { ViewLogInContext } from '../../../containers/logs/view_log_in_context'; +import { LogEntry } from '../../../../common/http_api'; +import { Source } from '../../../containers/source'; +import { LogViewConfiguration } from '../../../containers/logs/log_view_configuration'; +import { ScrollableLogTextStreamView } from '../../../components/logging/log_text_stream'; +import { useViewportDimensions } from '../../../utils/use_viewport_dimensions'; + +const MODAL_MARGIN = 25; + +export const PageViewLogInContext: React.FC = () => { + const { source } = useContext(Source.Context); + const { textScale, textWrap } = useContext(LogViewConfiguration.Context); + const columnConfigurations = useMemo(() => (source && source.configuration.logColumns) || [], [ + source, + ]); + const [{ contextEntry, entries, isLoading }, { setContextEntry }] = useContext( + ViewLogInContext.Context + ); + const closeModal = useCallback(() => setContextEntry(undefined), [setContextEntry]); + const { width: vw, height: vh } = useViewportDimensions(); + + const streamItems = useMemo( + () => + entries.map(entry => ({ + kind: 'logEntry' as const, + logEntry: entry, + highlights: [], + })), + [entries] + ); + + if (!contextEntry) { + return null; + } + + return ( + + + + + + + + + + + + + ); +}; + +const LogEntryContext: React.FC<{ context: LogEntry['context'] }> = ({ context }) => { + if ('container.id' in context) { + return

Displayed logs are from container {context['container.id']}

; + } + + if ('host.name' in context) { + const shortenedFilePath = + context['log.file.path'].length > 45 + ? context['log.file.path'].slice(0, 20) + '...' + context['log.file.path'].slice(-25) + : context['log.file.path']; + + return ( + +

+ + Displayed logs are from file{' '} + + {shortenedFilePath} + {' '} + and host {context['host.name']} + +

+
+ ); + } + + return null; +}; diff --git a/x-pack/plugins/infra/public/utils/use_viewport_dimensions.ts b/x-pack/plugins/infra/public/utils/use_viewport_dimensions.ts new file mode 100644 index 0000000000000..ddaf8fcd31a39 --- /dev/null +++ b/x-pack/plugins/infra/public/utils/use_viewport_dimensions.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useState, useEffect } from 'react'; +import { throttle } from 'lodash'; + +interface ViewportDimensions { + width: number; + height: number; +} + +const getViewportWidth = () => + window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; +const getViewportHeight = () => + window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; + +export function useViewportDimensions(): ViewportDimensions { + const [dimensions, setDimensions] = useState({ + width: getViewportWidth(), + height: getViewportHeight(), + }); + + useEffect(() => { + const updateDimensions = throttle(() => { + setDimensions({ + width: getViewportWidth(), + height: getViewportHeight(), + }); + }, 250); + + window.addEventListener('resize', updateDimensions); + return () => window.removeEventListener('resize', updateDimensions); + }, []); + + return dimensions; +} diff --git a/x-pack/plugins/infra/server/lib/domains/log_entries_domain/log_entries_domain.ts b/x-pack/plugins/infra/server/lib/domains/log_entries_domain/log_entries_domain.ts index 528b9a69327fa..1e84a8c016c87 100644 --- a/x-pack/plugins/infra/server/lib/domains/log_entries_domain/log_entries_domain.ts +++ b/x-pack/plugins/infra/server/lib/domains/log_entries_domain/log_entries_domain.ts @@ -156,14 +156,7 @@ export class InfraLogEntriesDomain { } } ), - context: FIELDS_FROM_CONTEXT.reduce((ctx, field) => { - // Users might have different types here in their mappings. - const value = doc.fields[field]; - if (typeof value === 'string') { - ctx[field] = value; - } - return ctx; - }, {}), + context: getContextFromDoc(doc), }; }); @@ -352,3 +345,20 @@ const createHighlightQueryDsl = (phrase: string, fields: string[]) => ({ type: 'phrase', }, }); + +const getContextFromDoc = (doc: LogEntryDocument): LogEntry['context'] => { + // Get all context fields, then test for the presence and type of the ones that go together + const containerId = doc.fields['container.id']; + const hostName = doc.fields['host.name']; + const logFilePath = doc.fields['log.file.path']; + + if (typeof containerId === 'string') { + return { 'container.id': containerId }; + } + + if (typeof hostName === 'string' && typeof logFilePath === 'string') { + return { 'host.name': hostName, 'log.file.path': logFilePath }; + } + + return {}; +}; diff --git a/x-pack/test/api_integration/apis/infra/log_entries.ts b/x-pack/test/api_integration/apis/infra/log_entries.ts index 3c12f5e4dc789..991dc4a7f96cf 100644 --- a/x-pack/test/api_integration/apis/infra/log_entries.ts +++ b/x-pack/test/api_integration/apis/infra/log_entries.ts @@ -126,7 +126,7 @@ export default function({ getService }: FtrProviderContext) { expect(messageColumn.message.length).to.be.greaterThan(0); }); - it('Returns the context fields', async () => { + it('Does not build context if entry does not have all fields', async () => { const { body } = await supertest .post(LOG_ENTRIES_PATH) .set(COMMON_HEADERS) @@ -147,9 +147,7 @@ export default function({ getService }: FtrProviderContext) { const entries = logEntriesResponse.data.entries; const entry = entries[0]; - - expect(entry.context).to.have.property('host.name'); - expect(entry.context['host.name']).to.be('demo-stack-nginx-01'); + expect(entry.context).to.eql({}); }); it('Paginates correctly with `after`', async () => { From 085c2452d5c405021e12f999353217a679e44478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez?= Date: Fri, 24 Apr 2020 22:30:10 +0200 Subject: [PATCH 02/26] [Logs UI] Complete `extendDatemath` test suite (#64069) * Add tests for datemath: `after` direction with a negative operator * Add tests for datemath: `after` direction with a positive operator Co-authored-by: Elastic Machine --- .../infra/public/utils/datemath.test.ts | 270 +++++++++++++++++- x-pack/plugins/infra/public/utils/datemath.ts | 3 +- 2 files changed, 271 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/infra/public/utils/datemath.test.ts b/x-pack/plugins/infra/public/utils/datemath.test.ts index 0f272733c5f97..c8fbe5583db2e 100644 --- a/x-pack/plugins/infra/public/utils/datemath.test.ts +++ b/x-pack/plugins/infra/public/utils/datemath.test.ts @@ -198,7 +198,7 @@ describe('extendDatemath()', () => { }); }); - describe('with a positive Operator', () => { + describe('with a positive operator', () => { it('Halves miliseconds', () => { expect(extendDatemath('now+250ms')).toEqual({ value: 'now+125ms', @@ -307,6 +307,274 @@ describe('extendDatemath()', () => { }); }); }); + + describe('moving after', () => { + describe('with a negative operator', () => { + it('Halves miliseconds', () => { + expect(extendDatemath('now-250ms', 'after')).toEqual({ + value: 'now-125ms', + diffAmount: 125, + diffUnit: 'ms', + }); + }); + + it('Halves seconds', () => { + expect(extendDatemath('now-10s', 'after')).toEqual({ + value: 'now-5s', + diffAmount: 5, + diffUnit: 's', + }); + }); + + it('Halves minutes when the amount is low', () => { + expect(extendDatemath('now-2m', 'after')).toEqual({ + value: 'now-1m', + diffAmount: 1, + diffUnit: 'm', + }); + expect(extendDatemath('now-4m', 'after')).toEqual({ + value: 'now-2m', + diffAmount: 2, + diffUnit: 'm', + }); + expect(extendDatemath('now-6m', 'after')).toEqual({ + value: 'now-3m', + diffAmount: 3, + diffUnit: 'm', + }); + }); + + it('advances minutes in half ammounts when the amount is high', () => { + expect(extendDatemath('now-30m', 'after')).toEqual({ + value: 'now-20m', + diffAmount: 10, + diffUnit: 'm', + }); + }); + + it('advances half an hour when the amount is one hour', () => { + expect(extendDatemath('now-1h', 'after')).toEqual({ + value: 'now-30m', + diffAmount: 30, + diffUnit: 'm', + }); + }); + + it('advances one hour when the amount is one day', () => { + expect(extendDatemath('now-1d', 'after')).toEqual({ + value: 'now-23h', + diffAmount: 1, + diffUnit: 'h', + }); + }); + + it('advances one day when the amount is more than one day', () => { + expect(extendDatemath('now-2d', 'after')).toEqual({ + value: 'now-1d', + diffAmount: 1, + diffUnit: 'd', + }); + expect(extendDatemath('now-3d', 'after')).toEqual({ + value: 'now-2d', + diffAmount: 1, + diffUnit: 'd', + }); + }); + + it('advances one day when the amount is one week', () => { + expect(extendDatemath('now-1w', 'after')).toEqual({ + value: 'now-6d', + diffAmount: 1, + diffUnit: 'd', + }); + }); + + it('advances one week when the amount is more than one week', () => { + expect(extendDatemath('now-2w', 'after')).toEqual({ + value: 'now-1w', + diffAmount: 1, + diffUnit: 'w', + }); + }); + + it('advances one week when the amount is one month', () => { + expect(extendDatemath('now-1M', 'after')).toEqual({ + value: 'now-3w', + diffAmount: 1, + diffUnit: 'w', + }); + }); + + it('advances one month when the amount is more than one month', () => { + expect(extendDatemath('now-2M', 'after')).toEqual({ + value: 'now-1M', + diffAmount: 1, + diffUnit: 'M', + }); + }); + + it('advances one month when the amount is one year', () => { + expect(extendDatemath('now-1y', 'after')).toEqual({ + value: 'now-11M', + diffAmount: 1, + diffUnit: 'M', + }); + }); + + it('advances one year when the amount is in years', () => { + expect(extendDatemath('now-2y', 'after')).toEqual({ + value: 'now-1y', + diffAmount: 1, + diffUnit: 'y', + }); + }); + }); + + describe('with a positive operator', () => { + it('doubles miliseconds', () => { + expect(extendDatemath('now+250ms', 'after')).toEqual({ + value: 'now+500ms', + diffAmount: 250, + diffUnit: 'ms', + }); + }); + + it('normalizes miliseconds', () => { + expect(extendDatemath('now+500ms', 'after')).toEqual({ + value: 'now+1s', + diffAmount: 500, + diffUnit: 'ms', + }); + }); + + it('doubles seconds', () => { + expect(extendDatemath('now+10s', 'after')).toEqual({ + value: 'now+20s', + diffAmount: 10, + diffUnit: 's', + }); + }); + + it('normalizes seconds', () => { + expect(extendDatemath('now+30s', 'after')).toEqual({ + value: 'now+1m', + diffAmount: 30, + diffUnit: 's', + }); + }); + + it('doubles minutes when amount is low', () => { + expect(extendDatemath('now+1m', 'after')).toEqual({ + value: 'now+2m', + diffAmount: 1, + diffUnit: 'm', + }); + expect(extendDatemath('now+2m', 'after')).toEqual({ + value: 'now+4m', + diffAmount: 2, + diffUnit: 'm', + }); + expect(extendDatemath('now+3m', 'after')).toEqual({ + value: 'now+6m', + diffAmount: 3, + diffUnit: 'm', + }); + }); + + it('adds half the minutes when the amount is high', () => { + expect(extendDatemath('now+20m', 'after')).toEqual({ + value: 'now+30m', + diffAmount: 10, + diffUnit: 'm', + }); + }); + + it('Adds half an hour when the amount is one hour', () => { + expect(extendDatemath('now+1h', 'after')).toEqual({ + value: 'now+90m', + diffAmount: 30, + diffUnit: 'm', + }); + }); + + it('Adds one hour when the amount more than one hour', () => { + expect(extendDatemath('now+2h', 'after')).toEqual({ + value: 'now+3h', + diffAmount: 1, + diffUnit: 'h', + }); + }); + + it('Adds one hour when the amount is one day', () => { + expect(extendDatemath('now+1d', 'after')).toEqual({ + value: 'now+25h', + diffAmount: 1, + diffUnit: 'h', + }); + }); + + it('Adds one day when the amount is more than one day', () => { + expect(extendDatemath('now+2d', 'after')).toEqual({ + value: 'now+3d', + diffAmount: 1, + diffUnit: 'd', + }); + expect(extendDatemath('now+3d', 'after')).toEqual({ + value: 'now+4d', + diffAmount: 1, + diffUnit: 'd', + }); + }); + + it('Adds one day when the amount is one week', () => { + expect(extendDatemath('now+1w', 'after')).toEqual({ + value: 'now+8d', + diffAmount: 1, + diffUnit: 'd', + }); + }); + + it('Adds one week when the amount is more than one week', () => { + expect(extendDatemath('now+2w', 'after')).toEqual({ + value: 'now+3w', + diffAmount: 1, + diffUnit: 'w', + }); + }); + + it('Adds one week when the amount is one month', () => { + expect(extendDatemath('now+1M', 'after')).toEqual({ + value: 'now+5w', + diffAmount: 1, + diffUnit: 'w', + }); + }); + + it('Adds one month when the amount is more than one month', () => { + expect(extendDatemath('now+2M', 'after')).toEqual({ + value: 'now+3M', + diffAmount: 1, + diffUnit: 'M', + }); + }); + + it('Adds one month when the amount is one year', () => { + expect(extendDatemath('now+1y', 'after')).toEqual({ + value: 'now+13M', + diffAmount: 1, + diffUnit: 'M', + }); + }); + + it('Adds one year when the amount is in years', () => { + expect(extendDatemath('now+2y', 'after')).toEqual({ + value: 'now+3y', + diffAmount: 1, + diffUnit: 'y', + }); + }); + }); + }); }); describe('convertDate()', () => { diff --git a/x-pack/plugins/infra/public/utils/datemath.ts b/x-pack/plugins/infra/public/utils/datemath.ts index 50a9b6e4f6945..7331a2450956f 100644 --- a/x-pack/plugins/infra/public/utils/datemath.ts +++ b/x-pack/plugins/infra/public/utils/datemath.ts @@ -68,7 +68,8 @@ function extendRelativeDatemath( return undefined; } - const mustIncreaseAmount = operator === '-' && direction === 'before'; + const mustIncreaseAmount = + (operator === '-' && direction === 'before') || (operator === '+' && direction === 'after'); const parsedAmount = parseInt(amount, 10); let newUnit: Unit = unit as Unit; let newAmount: number; From c0bf910a706710123926b5716cf624baabb324e6 Mon Sep 17 00:00:00 2001 From: Dmitry Lemeshko Date: Fri, 24 Apr 2020 23:59:14 +0300 Subject: [PATCH 03/26] Re-enable Firefox functional testing on CI (#64159) * bring testing on Firefox back * disable some tests * skip more tests * cut more suites for Firefox * skip more tests for Firefox * replace smoke tag with includeFirefox Co-authored-by: Elastic Machine --- Jenkinsfile | 4 ++-- docs/developer/core/development-functional-tests.asciidoc | 6 +++--- test/functional/apps/console/_console.ts | 2 +- test/functional/apps/context/_discover_navigation.js | 1 - test/functional/apps/dashboard/dashboard_filtering.js | 2 +- test/functional/apps/dashboard/dashboard_save.js | 2 +- test/functional/apps/dashboard/panel_controls.js | 2 -- test/functional/apps/dashboard/time_zones.js | 2 +- test/functional/apps/discover/_doc_navigation.js | 1 - test/functional/apps/discover/_field_data.js | 2 +- test/functional/apps/getting_started/index.js | 2 +- test/functional/apps/home/_home.js | 2 +- test/functional/apps/home/_sample_data.ts | 2 -- .../apps/management/_create_index_pattern_wizard.js | 2 -- test/functional/apps/visualize/_experimental_vis.js | 2 -- test/functional/apps/visualize/_gauge_chart.js | 2 -- test/functional/apps/visualize/_heatmap_chart.js | 1 - test/functional/apps/visualize/_inspector.js | 1 - test/functional/apps/visualize/_tsvb_chart.ts | 1 - .../apps/visualize/input_control_vis/chained_controls.js | 2 +- test/scripts/jenkins_firefox_smoke.sh | 2 +- test/scripts/jenkins_xpack_firefox_smoke.sh | 2 +- x-pack/test/functional/apps/api_keys/home_page.ts | 1 - x-pack/test/functional/apps/canvas/smoke_test.js | 2 +- .../functional/apps/cross_cluster_replication/home_page.ts | 1 - x-pack/test/functional/apps/grok_debugger/grok_debugger.js | 2 +- .../functional/apps/index_lifecycle_management/home_page.ts | 1 - x-pack/test/functional/apps/index_management/home_page.ts | 1 - x-pack/test/functional/apps/infra/home_page.ts | 2 +- x-pack/test/functional/apps/infra/link_to.ts | 1 - .../test/functional/apps/infra/log_entry_categories_tab.ts | 2 +- x-pack/test/functional/apps/infra/log_entry_rate_tab.ts | 2 +- .../test/functional/apps/infra/logs_source_configuration.ts | 2 -- .../functional/apps/infra/metrics_source_configuration.ts | 1 - x-pack/test/functional/apps/logstash/index.js | 2 +- .../apps/machine_learning/anomaly_detection/advanced_job.ts | 2 +- .../machine_learning/anomaly_detection/anomaly_explorer.ts | 2 +- .../anomaly_detection/categorization_job.ts | 2 +- .../machine_learning/anomaly_detection/date_nanos_job.ts | 2 +- .../machine_learning/anomaly_detection/multi_metric_job.ts | 2 +- .../machine_learning/anomaly_detection/population_job.ts | 2 +- .../machine_learning/anomaly_detection/saved_search_job.ts | 2 +- .../machine_learning/anomaly_detection/single_metric_job.ts | 2 +- .../anomaly_detection/single_metric_viewer.ts | 2 +- .../data_frame_analytics/classification_creation.ts | 1 - .../apps/machine_learning/data_frame_analytics/cloning.ts | 2 -- .../data_frame_analytics/outlier_detection_creation.ts | 1 - .../data_frame_analytics/regression_creation.ts | 1 - .../data_visualizer/file_data_visualizer.ts | 2 +- .../data_visualizer/index_data_visualizer.ts | 2 +- x-pack/test/functional/apps/machine_learning/pages.ts | 2 +- x-pack/test/functional/apps/remote_clusters/home_page.ts | 1 - x-pack/test/functional/apps/security/security.ts | 2 +- x-pack/test/functional/apps/security/user_email.js | 1 - x-pack/test/functional/apps/security/users.js | 1 - x-pack/test/functional/apps/snapshot_restore/home_page.ts | 1 - x-pack/test/functional/apps/spaces/enter_space.ts | 2 +- x-pack/test/functional/apps/spaces/spaces_selection.ts | 2 +- x-pack/test/functional/apps/status_page/status_page.ts | 2 +- x-pack/test/functional/apps/transform/cloning.ts | 1 - .../functional/apps/transform/creation_index_pattern.ts | 1 - .../test/functional/apps/transform/creation_saved_search.ts | 1 - .../functional/apps/upgrade_assistant/upgrade_assistant.ts | 2 +- x-pack/test/functional/apps/watcher/index.js | 2 +- 64 files changed, 39 insertions(+), 74 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6646ee15ba1c2..98cc6994f229b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -11,7 +11,7 @@ kibanaPipeline(timeoutMinutes: 135, checkPrChanges: true) { 'kibana-intake-agent': workers.intake('kibana-intake', './test/scripts/jenkins_unit.sh'), 'x-pack-intake-agent': workers.intake('x-pack-intake', './test/scripts/jenkins_xpack.sh'), 'kibana-oss-agent': workers.functional('kibana-oss-tests', { kibanaPipeline.buildOss() }, [ - // 'oss-firefoxSmoke': kibanaPipeline.functionalTestProcess('kibana-firefoxSmoke', './test/scripts/jenkins_firefox_smoke.sh'), + 'oss-firefoxSmoke': kibanaPipeline.functionalTestProcess('kibana-firefoxSmoke', './test/scripts/jenkins_firefox_smoke.sh'), 'oss-ciGroup1': kibanaPipeline.ossCiGroupProcess(1), 'oss-ciGroup2': kibanaPipeline.ossCiGroupProcess(2), 'oss-ciGroup3': kibanaPipeline.ossCiGroupProcess(3), @@ -28,7 +28,7 @@ kibanaPipeline(timeoutMinutes: 135, checkPrChanges: true) { // 'oss-visualRegression': kibanaPipeline.functionalTestProcess('visualRegression', './test/scripts/jenkins_visual_regression.sh'), ]), 'kibana-xpack-agent': workers.functional('kibana-xpack-tests', { kibanaPipeline.buildXpack() }, [ - // 'xpack-firefoxSmoke': kibanaPipeline.functionalTestProcess('xpack-firefoxSmoke', './test/scripts/jenkins_xpack_firefox_smoke.sh'), + 'xpack-firefoxSmoke': kibanaPipeline.functionalTestProcess('xpack-firefoxSmoke', './test/scripts/jenkins_xpack_firefox_smoke.sh'), 'xpack-ciGroup1': kibanaPipeline.xpackCiGroupProcess(1), 'xpack-ciGroup2': kibanaPipeline.xpackCiGroupProcess(2), 'xpack-ciGroup3': kibanaPipeline.xpackCiGroupProcess(3), diff --git a/docs/developer/core/development-functional-tests.asciidoc b/docs/developer/core/development-functional-tests.asciidoc index 51b5273851ce7..2b091d9abb9fc 100644 --- a/docs/developer/core/development-functional-tests.asciidoc +++ b/docs/developer/core/development-functional-tests.asciidoc @@ -154,16 +154,16 @@ A test suite is a collection of tests defined by calling `describe()`, and then Use tags in `describe()` function to group functional tests. Tags include: * `ciGroup{id}` - Assigns test suite to a specific CI worker * `skipCloud` and `skipFirefox` - Excludes test suite from running on Cloud or Firefox -* `smoke` - Groups tests that run on Chrome and Firefox +* `includeFirefox` - Groups tests that run on Chrome and Firefox **Cross-browser testing**::: -On CI, all the functional tests are executed in Chrome by default. To also run a suite against Firefox, assign the `smoke` tag: +On CI, all the functional tests are executed in Chrome by default. To also run a suite against Firefox, assign the `includeFirefox` tag: ["source","js"] ----------- // on CI test suite will be run twice: in Chrome and Firefox describe('My Cross-browser Test Suite', function () { - this.tags('smoke'); + this.tags('includeFirefox'); it('My First Test'); } diff --git a/test/functional/apps/console/_console.ts b/test/functional/apps/console/_console.ts index 456752c0cd6eb..47b8a4a2e9f70 100644 --- a/test/functional/apps/console/_console.ts +++ b/test/functional/apps/console/_console.ts @@ -40,7 +40,7 @@ export default function({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['common', 'console']); describe('console app', function describeIndexTests() { - this.tags('smoke'); + this.tags('includeFirefox'); before(async () => { log.debug('navigateTo console'); await PageObjects.common.navigateToApp('console'); diff --git a/test/functional/apps/context/_discover_navigation.js b/test/functional/apps/context/_discover_navigation.js index a56a85546bbcd..9a0130d39bc2f 100644 --- a/test/functional/apps/context/_discover_navigation.js +++ b/test/functional/apps/context/_discover_navigation.js @@ -33,7 +33,6 @@ export default function({ getService, getPageObjects }) { // FLAKY: https://github.com/elastic/kibana/issues/53308 describe.skip('context link in discover', function contextSize() { - this.tags('smoke'); before(async function() { await PageObjects.common.navigateToApp('discover'); await PageObjects.timePicker.setDefaultAbsoluteRange(); diff --git a/test/functional/apps/dashboard/dashboard_filtering.js b/test/functional/apps/dashboard/dashboard_filtering.js index f388993dcaf7d..8846a753f3794 100644 --- a/test/functional/apps/dashboard/dashboard_filtering.js +++ b/test/functional/apps/dashboard/dashboard_filtering.js @@ -38,7 +38,7 @@ export default function({ getService, getPageObjects }) { const PageObjects = getPageObjects(['common', 'dashboard', 'header', 'visualize', 'timePicker']); describe('dashboard filtering', function() { - this.tags('smoke'); + this.tags('includeFirefox'); before(async () => { await esArchiver.load('dashboard/current/kibana'); diff --git a/test/functional/apps/dashboard/dashboard_save.js b/test/functional/apps/dashboard/dashboard_save.js index 2ea1389b89ad4..7ffe951faa398 100644 --- a/test/functional/apps/dashboard/dashboard_save.js +++ b/test/functional/apps/dashboard/dashboard_save.js @@ -24,7 +24,7 @@ export default function({ getPageObjects, getService }) { const listingTable = getService('listingTable'); describe('dashboard save', function describeIndexTests() { - this.tags('smoke'); + this.tags('includeFirefox'); const dashboardName = 'Dashboard Save Test'; const dashboardNameEnterKey = 'Dashboard Save Test with Enter Key'; diff --git a/test/functional/apps/dashboard/panel_controls.js b/test/functional/apps/dashboard/panel_controls.js index 6e24b9f3570a3..279adb22a1cfa 100644 --- a/test/functional/apps/dashboard/panel_controls.js +++ b/test/functional/apps/dashboard/panel_controls.js @@ -43,8 +43,6 @@ export default function({ getService, getPageObjects }) { const dashboardName = 'Dashboard Panel Controls Test'; describe('dashboard panel controls', function viewEditModeTests() { - this.tags('smoke'); - before(async function() { await PageObjects.dashboard.initTests(); await PageObjects.dashboard.preserveCrossAppState(); diff --git a/test/functional/apps/dashboard/time_zones.js b/test/functional/apps/dashboard/time_zones.js index b7698a7d6ac4b..564eb790eb8d1 100644 --- a/test/functional/apps/dashboard/time_zones.js +++ b/test/functional/apps/dashboard/time_zones.js @@ -27,7 +27,7 @@ export default function({ getService, getPageObjects }) { const PageObjects = getPageObjects(['dashboard', 'timePicker', 'settings', 'common']); describe('dashboard time zones', function() { - this.tags('smoke'); + this.tags('includeFirefox'); before(async () => { await esArchiver.load('dashboard/current/kibana'); diff --git a/test/functional/apps/discover/_doc_navigation.js b/test/functional/apps/discover/_doc_navigation.js index 08e0cb0b8d23a..ebce8dcafadb4 100644 --- a/test/functional/apps/discover/_doc_navigation.js +++ b/test/functional/apps/discover/_doc_navigation.js @@ -33,7 +33,6 @@ export default function({ getService, getPageObjects }) { // FLAKY: https://github.com/elastic/kibana/issues/62281 describe.skip('doc link in discover', function contextSize() { - this.tags('smoke'); before(async function() { await esArchiver.loadIfNeeded('logstash_functional'); await PageObjects.common.navigateToApp('discover'); diff --git a/test/functional/apps/discover/_field_data.js b/test/functional/apps/discover/_field_data.js index 62d42f3da5c84..ace9710665f10 100644 --- a/test/functional/apps/discover/_field_data.js +++ b/test/functional/apps/discover/_field_data.js @@ -28,7 +28,7 @@ export default function({ getService, getPageObjects }) { const PageObjects = getPageObjects(['common', 'header', 'discover', 'visualize', 'timePicker']); describe('discover tab', function describeIndexTests() { - this.tags('smoke'); + this.tags('includeFirefox'); before(async function() { await esArchiver.loadIfNeeded('logstash_functional'); await esArchiver.load('discover'); diff --git a/test/functional/apps/getting_started/index.js b/test/functional/apps/getting_started/index.js index b73c16e2583b5..41ee71a753712 100644 --- a/test/functional/apps/getting_started/index.js +++ b/test/functional/apps/getting_started/index.js @@ -21,7 +21,7 @@ export default function({ getService, loadTestFile }) { const browser = getService('browser'); describe('Getting Started ', function() { - this.tags(['ciGroup6', 'smoke']); + this.tags(['ciGroup6']); before(async function() { await browser.setWindowSize(1200, 800); diff --git a/test/functional/apps/home/_home.js b/test/functional/apps/home/_home.js index 6587c2f113b7f..3c56c22c046dd 100644 --- a/test/functional/apps/home/_home.js +++ b/test/functional/apps/home/_home.js @@ -25,7 +25,7 @@ export default function({ getService, getPageObjects }) { const PageObjects = getPageObjects(['common', 'home']); describe('Kibana takes you home', function describeIndexTests() { - this.tags('smoke'); + this.tags('includeFirefox'); it('clicking on kibana logo should take you to home page', async () => { await PageObjects.common.navigateToApp('settings'); diff --git a/test/functional/apps/home/_sample_data.ts b/test/functional/apps/home/_sample_data.ts index 5812b9b96e42a..f46b3390cbcf8 100644 --- a/test/functional/apps/home/_sample_data.ts +++ b/test/functional/apps/home/_sample_data.ts @@ -32,8 +32,6 @@ export default function({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['common', 'header', 'home', 'dashboard', 'timePicker']); describe('sample data', function describeIndexTests() { - this.tags('smoke'); - before(async () => { await security.testUser.setRoles(['kibana_admin', 'kibana_sample_admin']); await PageObjects.common.navigateToUrl('home', 'tutorial_directory/sampleData'); diff --git a/test/functional/apps/management/_create_index_pattern_wizard.js b/test/functional/apps/management/_create_index_pattern_wizard.js index c8d11d8555d37..65d852b249ea0 100644 --- a/test/functional/apps/management/_create_index_pattern_wizard.js +++ b/test/functional/apps/management/_create_index_pattern_wizard.js @@ -25,8 +25,6 @@ export default function({ getService, getPageObjects }) { const PageObjects = getPageObjects(['settings', 'common']); describe('"Create Index Pattern" wizard', function() { - this.tags('smoke'); - before(async function() { // delete .kibana index and then wait for Kibana to re-create it await kibanaServer.uiSettings.replace({}); diff --git a/test/functional/apps/visualize/_experimental_vis.js b/test/functional/apps/visualize/_experimental_vis.js index c45a95abab86e..22d36d671cb68 100644 --- a/test/functional/apps/visualize/_experimental_vis.js +++ b/test/functional/apps/visualize/_experimental_vis.js @@ -24,8 +24,6 @@ export default ({ getService, getPageObjects }) => { const PageObjects = getPageObjects(['visualize']); describe('experimental visualizations in visualize app ', function() { - this.tags('smoke'); - describe('experimental visualizations', () => { beforeEach(async () => { log.debug('navigateToApp visualize'); diff --git a/test/functional/apps/visualize/_gauge_chart.js b/test/functional/apps/visualize/_gauge_chart.js index 7ebb4548f967b..d7a30f39250f3 100644 --- a/test/functional/apps/visualize/_gauge_chart.js +++ b/test/functional/apps/visualize/_gauge_chart.js @@ -28,8 +28,6 @@ export default function({ getService, getPageObjects }) { // FLAKY: https://github.com/elastic/kibana/issues/45089 describe('gauge chart', function indexPatternCreation() { - this.tags('smoke'); - async function initGaugeVis() { log.debug('navigateToApp visualize'); await PageObjects.visualize.navigateToNewVisualization(); diff --git a/test/functional/apps/visualize/_heatmap_chart.js b/test/functional/apps/visualize/_heatmap_chart.js index cbf7ab8df6831..842599fa1d0a1 100644 --- a/test/functional/apps/visualize/_heatmap_chart.js +++ b/test/functional/apps/visualize/_heatmap_chart.js @@ -25,7 +25,6 @@ export default function({ getService, getPageObjects }) { const PageObjects = getPageObjects(['visualize', 'visEditor', 'visChart', 'timePicker']); describe('heatmap chart', function indexPatternCreation() { - this.tags('smoke'); const vizName1 = 'Visualization HeatmapChart'; before(async function() { diff --git a/test/functional/apps/visualize/_inspector.js b/test/functional/apps/visualize/_inspector.js index d989f8e2539a0..256c0362226e5 100644 --- a/test/functional/apps/visualize/_inspector.js +++ b/test/functional/apps/visualize/_inspector.js @@ -24,7 +24,6 @@ export default function({ getService, getPageObjects }) { const PageObjects = getPageObjects(['visualize', 'visEditor', 'visChart', 'timePicker']); describe('inspector', function describeIndexTests() { - this.tags('smoke'); before(async function() { await PageObjects.visualize.navigateToNewVisualization(); await PageObjects.visualize.clickVerticalBarChart(); diff --git a/test/functional/apps/visualize/_tsvb_chart.ts b/test/functional/apps/visualize/_tsvb_chart.ts index 867db66ac81dc..27a06cc05b45c 100644 --- a/test/functional/apps/visualize/_tsvb_chart.ts +++ b/test/functional/apps/visualize/_tsvb_chart.ts @@ -29,7 +29,6 @@ export default function({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['visualize', 'visualBuilder', 'timePicker', 'visChart']); describe('visual builder', function describeIndexTests() { - this.tags('smoke'); beforeEach(async () => { await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); await PageObjects.visualize.navigateToNewVisualization(); diff --git a/test/functional/apps/visualize/input_control_vis/chained_controls.js b/test/functional/apps/visualize/input_control_vis/chained_controls.js index b56a37218aba5..b5231f3161377 100644 --- a/test/functional/apps/visualize/input_control_vis/chained_controls.js +++ b/test/functional/apps/visualize/input_control_vis/chained_controls.js @@ -27,7 +27,7 @@ export default function({ getService, getPageObjects }) { const comboBox = getService('comboBox'); describe('chained controls', function() { - this.tags('smoke'); + this.tags('includeFirefox'); before(async () => { await PageObjects.common.navigateToApp('visualize'); diff --git a/test/scripts/jenkins_firefox_smoke.sh b/test/scripts/jenkins_firefox_smoke.sh index 0129d4f1bce9f..2bba6e06d76d7 100755 --- a/test/scripts/jenkins_firefox_smoke.sh +++ b/test/scripts/jenkins_firefox_smoke.sh @@ -6,5 +6,5 @@ checks-reporter-with-killswitch "Firefox smoke test" \ node scripts/functional_tests \ --bail --debug \ --kibana-install-dir "$installDir" \ - --include-tag "smoke" \ + --include-tag "includeFirefox" \ --config test/functional/config.firefox.js; diff --git a/test/scripts/jenkins_xpack_firefox_smoke.sh b/test/scripts/jenkins_xpack_firefox_smoke.sh index 5fe8b41cc0010..fdaee76cafa9d 100755 --- a/test/scripts/jenkins_xpack_firefox_smoke.sh +++ b/test/scripts/jenkins_xpack_firefox_smoke.sh @@ -6,5 +6,5 @@ checks-reporter-with-killswitch "X-Pack firefox smoke test" \ node scripts/functional_tests \ --debug --bail \ --kibana-install-dir "$KIBANA_INSTALL_DIR" \ - --include-tag "smoke" \ + --include-tag "includeFirefox" \ --config test/functional/config.firefox.js; diff --git a/x-pack/test/functional/apps/api_keys/home_page.ts b/x-pack/test/functional/apps/api_keys/home_page.ts index 1c83a17e78ca7..abfd90bd6ad8e 100644 --- a/x-pack/test/functional/apps/api_keys/home_page.ts +++ b/x-pack/test/functional/apps/api_keys/home_page.ts @@ -13,7 +13,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const security = getService('security'); describe('Home page', function() { - this.tags('smoke'); before(async () => { await security.testUser.setRoles(['kibana_admin']); await pageObjects.common.navigateToApp('apiKeys'); diff --git a/x-pack/test/functional/apps/canvas/smoke_test.js b/x-pack/test/functional/apps/canvas/smoke_test.js index a240a55b9765c..df41b725f6daf 100644 --- a/x-pack/test/functional/apps/canvas/smoke_test.js +++ b/x-pack/test/functional/apps/canvas/smoke_test.js @@ -15,7 +15,7 @@ export default function canvasSmokeTest({ getService, getPageObjects }) { const PageObjects = getPageObjects(['common']); describe('smoke test', function() { - this.tags('smoke'); + this.tags('includeFirefox'); const workpadListSelector = 'canvasWorkpadLoaderTable > canvasWorkpadLoaderWorkpad'; const testWorkpadId = 'workpad-1705f884-6224-47de-ba49-ca224fe6ec31'; diff --git a/x-pack/test/functional/apps/cross_cluster_replication/home_page.ts b/x-pack/test/functional/apps/cross_cluster_replication/home_page.ts index eef47ae0341c8..8d3b98004245e 100644 --- a/x-pack/test/functional/apps/cross_cluster_replication/home_page.ts +++ b/x-pack/test/functional/apps/cross_cluster_replication/home_page.ts @@ -12,7 +12,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const log = getService('log'); describe('Home page', function() { - this.tags('smoke'); before(async () => { await pageObjects.common.navigateToApp('crossClusterReplication'); }); diff --git a/x-pack/test/functional/apps/grok_debugger/grok_debugger.js b/x-pack/test/functional/apps/grok_debugger/grok_debugger.js index 994f65a79011e..09d246a3a6e1b 100644 --- a/x-pack/test/functional/apps/grok_debugger/grok_debugger.js +++ b/x-pack/test/functional/apps/grok_debugger/grok_debugger.js @@ -12,7 +12,7 @@ export default function({ getService, getPageObjects }) { const PageObjects = getPageObjects(['grokDebugger']); describe('grok debugger app', function() { - this.tags('smoke'); + this.tags('includeFirefox'); before(async () => { await esArchiver.load('empty_kibana'); // Increase window height to ensure "Simulate" button is shown above the diff --git a/x-pack/test/functional/apps/index_lifecycle_management/home_page.ts b/x-pack/test/functional/apps/index_lifecycle_management/home_page.ts index c7ad3f933ea64..b5d43be21f0c5 100644 --- a/x-pack/test/functional/apps/index_lifecycle_management/home_page.ts +++ b/x-pack/test/functional/apps/index_lifecycle_management/home_page.ts @@ -12,7 +12,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const log = getService('log'); describe('Home page', function() { - this.tags('smoke'); before(async () => { await pageObjects.common.navigateToApp('indexLifecycleManagement'); }); diff --git a/x-pack/test/functional/apps/index_management/home_page.ts b/x-pack/test/functional/apps/index_management/home_page.ts index c6b7517fc1858..046b8ec44b9fa 100644 --- a/x-pack/test/functional/apps/index_management/home_page.ts +++ b/x-pack/test/functional/apps/index_management/home_page.ts @@ -14,7 +14,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const browser = getService('browser'); describe('Home page', function() { - this.tags('smoke'); before(async () => { await pageObjects.common.navigateToApp('indexManagement'); }); diff --git a/x-pack/test/functional/apps/infra/home_page.ts b/x-pack/test/functional/apps/infra/home_page.ts index 0c1d57202b8eb..ed8bec570ab60 100644 --- a/x-pack/test/functional/apps/infra/home_page.ts +++ b/x-pack/test/functional/apps/infra/home_page.ts @@ -15,7 +15,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'infraHome']); describe('Home page', function() { - this.tags('smoke'); + this.tags('includeFirefox'); before(async () => { await esArchiver.load('empty_kibana'); }); diff --git a/x-pack/test/functional/apps/infra/link_to.ts b/x-pack/test/functional/apps/infra/link_to.ts index a287d53d5df0b..4e5ebab90880e 100644 --- a/x-pack/test/functional/apps/infra/link_to.ts +++ b/x-pack/test/functional/apps/infra/link_to.ts @@ -21,7 +21,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const traceId = '433b4651687e18be2c6c8e3b11f53d09'; describe('Infra link-to', function() { - this.tags('smoke'); it('redirects to the logs app and parses URL search params correctly', async () => { const location = { hash: '', diff --git a/x-pack/test/functional/apps/infra/log_entry_categories_tab.ts b/x-pack/test/functional/apps/infra/log_entry_categories_tab.ts index c703738e37228..3dd1592286a3a 100644 --- a/x-pack/test/functional/apps/infra/log_entry_categories_tab.ts +++ b/x-pack/test/functional/apps/infra/log_entry_categories_tab.ts @@ -13,7 +13,7 @@ export default ({ getService }: FtrProviderContext) => { const retry = getService('retry'); describe('Log Entry Categories Tab', function() { - this.tags('smoke'); + this.tags('includeFirefox'); describe('with a trial license', () => { it('is visible', async () => { diff --git a/x-pack/test/functional/apps/infra/log_entry_rate_tab.ts b/x-pack/test/functional/apps/infra/log_entry_rate_tab.ts index 95228a520aaa2..ee4b59d04899f 100644 --- a/x-pack/test/functional/apps/infra/log_entry_rate_tab.ts +++ b/x-pack/test/functional/apps/infra/log_entry_rate_tab.ts @@ -13,7 +13,7 @@ export default ({ getService }: FtrProviderContext) => { const retry = getService('retry'); describe('Log Entry Rate Tab', function() { - this.tags('smoke'); + this.tags('includeFirefox'); describe('with a trial license', () => { it('is visible', async () => { diff --git a/x-pack/test/functional/apps/infra/logs_source_configuration.ts b/x-pack/test/functional/apps/infra/logs_source_configuration.ts index f40c908f23c80..7293405ce80ff 100644 --- a/x-pack/test/functional/apps/infra/logs_source_configuration.ts +++ b/x-pack/test/functional/apps/infra/logs_source_configuration.ts @@ -17,8 +17,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const retry = getService('retry'); describe('Logs Source Configuration', function() { - this.tags('smoke'); - before(async () => { await esArchiver.load('empty_kibana'); }); diff --git a/x-pack/test/functional/apps/infra/metrics_source_configuration.ts b/x-pack/test/functional/apps/infra/metrics_source_configuration.ts index d334fa7956be4..1c03b3ebf6681 100644 --- a/x-pack/test/functional/apps/infra/metrics_source_configuration.ts +++ b/x-pack/test/functional/apps/infra/metrics_source_configuration.ts @@ -15,7 +15,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'infraHome']); describe('Infrastructure Source Configuration', function() { - this.tags('smoke'); before(async () => { await esArchiver.load('empty_kibana'); }); diff --git a/x-pack/test/functional/apps/logstash/index.js b/x-pack/test/functional/apps/logstash/index.js index ee710b00b0be8..0ca09aa317bc0 100644 --- a/x-pack/test/functional/apps/logstash/index.js +++ b/x-pack/test/functional/apps/logstash/index.js @@ -6,7 +6,7 @@ export default function({ loadTestFile }) { describe('logstash', function() { - this.tags(['ciGroup2', 'smoke']); + this.tags(['ciGroup2']); loadTestFile(require.resolve('./pipeline_list')); loadTestFile(require.resolve('./pipeline_create')); diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/advanced_job.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/advanced_job.ts index a5faf325aa6cb..e238937ee845f 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/advanced_job.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/advanced_job.ts @@ -277,7 +277,7 @@ export default function({ getService }: FtrProviderContext) { const calendarId = `wizard-test-calendar_${Date.now()}`; describe('advanced job', function() { - this.tags(['smoke', 'mlqa']); + this.tags(['mlqa']); before(async () => { await esArchiver.loadIfNeeded('ml/ecommerce'); await ml.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/anomaly_explorer.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/anomaly_explorer.ts index 8827559a5f470..ae88208fa9a11 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/anomaly_explorer.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/anomaly_explorer.ts @@ -57,7 +57,7 @@ export default function({ getService }: FtrProviderContext) { const ml = getService('ml'); describe('anomaly explorer', function() { - this.tags(['smoke', 'mlqa']); + this.tags(['mlqa']); before(async () => { await esArchiver.loadIfNeeded('ml/farequote'); await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/categorization_job.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/categorization_job.ts index 9b5ae171d4115..5a39b06b4c15a 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/categorization_job.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/categorization_job.ts @@ -77,7 +77,7 @@ export default function({ getService }: FtrProviderContext) { const calendarId = `wizard-test-calendar_${Date.now()}`; describe('categorization', function() { - this.tags(['smoke', 'mlqa']); + this.tags(['mlqa']); before(async () => { await esArchiver.loadIfNeeded('ml/categorization'); await ml.testResources.createIndexPatternIfNeeded('ft_categorization', '@timestamp'); diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/date_nanos_job.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/date_nanos_job.ts index 570deee01c684..96b69c10f4c2f 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/date_nanos_job.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/date_nanos_job.ts @@ -166,7 +166,7 @@ export default function({ getService }: FtrProviderContext) { ]; describe('job on data set with date_nanos time field', function() { - this.tags(['smoke', 'mlqa']); + this.tags(['mlqa']); before(async () => { await esArchiver.loadIfNeeded('ml/event_rate_nanos'); await ml.testResources.createIndexPatternIfNeeded( diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/multi_metric_job.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/multi_metric_job.ts index 4739f987541d6..45b03b3d179b7 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/multi_metric_job.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/multi_metric_job.ts @@ -74,7 +74,7 @@ export default function({ getService }: FtrProviderContext) { const calendarId = `wizard-test-calendar_${Date.now()}`; describe('multi metric', function() { - this.tags(['smoke', 'mlqa']); + this.tags(['mlqa']); before(async () => { await esArchiver.loadIfNeeded('ml/farequote'); await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/population_job.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/population_job.ts index 0279c70bb73a9..a9c94a650898e 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/population_job.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/population_job.ts @@ -88,7 +88,7 @@ export default function({ getService }: FtrProviderContext) { const calendarId = `wizard-test-calendar_${Date.now()}`; describe('population', function() { - this.tags(['smoke', 'mlqa']); + this.tags(['mlqa']); before(async () => { await esArchiver.loadIfNeeded('ml/ecommerce'); await ml.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/saved_search_job.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/saved_search_job.ts index a5652d76358eb..862904862cb13 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/saved_search_job.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/saved_search_job.ts @@ -272,7 +272,7 @@ export default function({ getService }: FtrProviderContext) { ]; describe('saved search', function() { - this.tags(['smoke', 'mlqa']); + this.tags(['mlqa']); before(async () => { await esArchiver.loadIfNeeded('ml/farequote'); await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/single_metric_job.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/single_metric_job.ts index 43053decb3924..46fbc40139485 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/single_metric_job.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/single_metric_job.ts @@ -73,7 +73,7 @@ export default function({ getService }: FtrProviderContext) { const calendarId = `wizard-test-calendar_${Date.now()}`; describe('single metric', function() { - this.tags(['smoke', 'mlqa']); + this.tags(['mlqa']); before(async () => { await esArchiver.loadIfNeeded('ml/farequote'); await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/single_metric_viewer.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/single_metric_viewer.ts index cc7c9828ce87d..9e1829998bec4 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/single_metric_viewer.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/single_metric_viewer.ts @@ -40,7 +40,7 @@ export default function({ getService }: FtrProviderContext) { const ml = getService('ml'); describe('single metric viewer', function() { - this.tags(['smoke', 'mlqa']); + this.tags(['mlqa']); before(async () => { await esArchiver.loadIfNeeded('ml/farequote'); await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); diff --git a/x-pack/test/functional/apps/machine_learning/data_frame_analytics/classification_creation.ts b/x-pack/test/functional/apps/machine_learning/data_frame_analytics/classification_creation.ts index 8a6741bd88daa..eb57a743f14cb 100644 --- a/x-pack/test/functional/apps/machine_learning/data_frame_analytics/classification_creation.ts +++ b/x-pack/test/functional/apps/machine_learning/data_frame_analytics/classification_creation.ts @@ -12,7 +12,6 @@ export default function({ getService }: FtrProviderContext) { const ml = getService('ml'); describe('classification creation', function() { - this.tags(['smoke']); before(async () => { await esArchiver.loadIfNeeded('ml/bm_classification'); await ml.testResources.createIndexPatternIfNeeded('ft_bank_marketing', '@timestamp'); diff --git a/x-pack/test/functional/apps/machine_learning/data_frame_analytics/cloning.ts b/x-pack/test/functional/apps/machine_learning/data_frame_analytics/cloning.ts index d98d8feaaf4fe..93f225989592e 100644 --- a/x-pack/test/functional/apps/machine_learning/data_frame_analytics/cloning.ts +++ b/x-pack/test/functional/apps/machine_learning/data_frame_analytics/cloning.ts @@ -14,8 +14,6 @@ export default function({ getService }: FtrProviderContext) { const ml = getService('ml'); describe('jobs cloning supported by UI form', function() { - this.tags(['smoke']); - const testDataList: Array<{ suiteTitle: string; archive: string; diff --git a/x-pack/test/functional/apps/machine_learning/data_frame_analytics/outlier_detection_creation.ts b/x-pack/test/functional/apps/machine_learning/data_frame_analytics/outlier_detection_creation.ts index 8dfe058cf6885..4e8a9000598b3 100644 --- a/x-pack/test/functional/apps/machine_learning/data_frame_analytics/outlier_detection_creation.ts +++ b/x-pack/test/functional/apps/machine_learning/data_frame_analytics/outlier_detection_creation.ts @@ -12,7 +12,6 @@ export default function({ getService }: FtrProviderContext) { const ml = getService('ml'); describe('outlier detection creation', function() { - this.tags(['smoke']); before(async () => { await esArchiver.loadIfNeeded('ml/ihp_outlier'); await ml.testResources.createIndexPatternIfNeeded('ft_ihp_outlier', '@timestamp'); diff --git a/x-pack/test/functional/apps/machine_learning/data_frame_analytics/regression_creation.ts b/x-pack/test/functional/apps/machine_learning/data_frame_analytics/regression_creation.ts index 271f3e2018dad..c3718e421d451 100644 --- a/x-pack/test/functional/apps/machine_learning/data_frame_analytics/regression_creation.ts +++ b/x-pack/test/functional/apps/machine_learning/data_frame_analytics/regression_creation.ts @@ -12,7 +12,6 @@ export default function({ getService }: FtrProviderContext) { const ml = getService('ml'); describe('regression creation', function() { - this.tags(['smoke']); before(async () => { await esArchiver.loadIfNeeded('ml/egs_regression'); await ml.testResources.createIndexPatternIfNeeded('ft_egs_regression', '@timestamp'); diff --git a/x-pack/test/functional/apps/machine_learning/data_visualizer/file_data_visualizer.ts b/x-pack/test/functional/apps/machine_learning/data_visualizer/file_data_visualizer.ts index ae958ad7f570f..868e75228f1cc 100644 --- a/x-pack/test/functional/apps/machine_learning/data_visualizer/file_data_visualizer.ts +++ b/x-pack/test/functional/apps/machine_learning/data_visualizer/file_data_visualizer.ts @@ -34,7 +34,7 @@ export default function({ getService }: FtrProviderContext) { ]; describe('file based', function() { - this.tags(['smoke', 'mlqa']); + this.tags(['mlqa']); before(async () => { await ml.testResources.setKibanaTimeZoneToUTC(); diff --git a/x-pack/test/functional/apps/machine_learning/data_visualizer/index_data_visualizer.ts b/x-pack/test/functional/apps/machine_learning/data_visualizer/index_data_visualizer.ts index e71b57a4562e7..e4e0c1c92d73a 100644 --- a/x-pack/test/functional/apps/machine_learning/data_visualizer/index_data_visualizer.ts +++ b/x-pack/test/functional/apps/machine_learning/data_visualizer/index_data_visualizer.ts @@ -376,7 +376,7 @@ export default function({ getService }: FtrProviderContext) { } describe('index based', function() { - this.tags(['smoke', 'mlqa']); + this.tags(['mlqa']); before(async () => { await esArchiver.loadIfNeeded('ml/farequote'); await ml.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); diff --git a/x-pack/test/functional/apps/machine_learning/pages.ts b/x-pack/test/functional/apps/machine_learning/pages.ts index 95930f18061fa..3c3698792ff7d 100644 --- a/x-pack/test/functional/apps/machine_learning/pages.ts +++ b/x-pack/test/functional/apps/machine_learning/pages.ts @@ -10,7 +10,7 @@ export default function({ getService }: FtrProviderContext) { const ml = getService('ml'); describe('page navigation', function() { - this.tags(['smoke', 'mlqa']); + this.tags(['includeFirefox', 'mlqa']); before(async () => { await ml.api.cleanMlIndices(); await ml.securityUI.loginAsMlPowerUser(); diff --git a/x-pack/test/functional/apps/remote_clusters/home_page.ts b/x-pack/test/functional/apps/remote_clusters/home_page.ts index 879a0a11ede78..394e48404b927 100644 --- a/x-pack/test/functional/apps/remote_clusters/home_page.ts +++ b/x-pack/test/functional/apps/remote_clusters/home_page.ts @@ -11,7 +11,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common', 'remoteClusters']); describe('Home page', function() { - this.tags('smoke'); before(async () => { await pageObjects.common.navigateToApp('remoteClusters'); }); diff --git a/x-pack/test/functional/apps/security/security.ts b/x-pack/test/functional/apps/security/security.ts index 2096a7755e01d..37516acec7c4b 100644 --- a/x-pack/test/functional/apps/security/security.ts +++ b/x-pack/test/functional/apps/security/security.ts @@ -16,7 +16,7 @@ export default function({ getService, getPageObjects }: FtrProviderContext) { const spaces = getService('spaces'); describe('Security', function() { - this.tags('smoke'); + this.tags('includeFirefox'); describe('Login Page', () => { before(async () => { await esArchiver.load('empty_kibana'); diff --git a/x-pack/test/functional/apps/security/user_email.js b/x-pack/test/functional/apps/security/user_email.js index a007c40a06b62..b4adfe1ce2b66 100644 --- a/x-pack/test/functional/apps/security/user_email.js +++ b/x-pack/test/functional/apps/security/user_email.js @@ -12,7 +12,6 @@ export default function({ getService, getPageObjects }) { const esArchiver = getService('esArchiver'); describe('useremail', function() { - this.tags('smoke'); before(async () => { await esArchiver.load('security/discover'); await PageObjects.settings.navigateTo(); diff --git a/x-pack/test/functional/apps/security/users.js b/x-pack/test/functional/apps/security/users.js index f49a74a661a63..04d59334a01c4 100644 --- a/x-pack/test/functional/apps/security/users.js +++ b/x-pack/test/functional/apps/security/users.js @@ -12,7 +12,6 @@ export default function({ getService, getPageObjects }) { const log = getService('log'); describe('users', function() { - this.tags('smoke'); before(async () => { log.debug('users'); await PageObjects.settings.navigateTo(); diff --git a/x-pack/test/functional/apps/snapshot_restore/home_page.ts b/x-pack/test/functional/apps/snapshot_restore/home_page.ts index 608c7f321a08f..56ebee79d06ff 100644 --- a/x-pack/test/functional/apps/snapshot_restore/home_page.ts +++ b/x-pack/test/functional/apps/snapshot_restore/home_page.ts @@ -13,7 +13,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const es = getService('legacyEs'); describe('Home page', function() { - this.tags('smoke'); before(async () => { await pageObjects.common.navigateToApp('snapshotRestore'); }); diff --git a/x-pack/test/functional/apps/spaces/enter_space.ts b/x-pack/test/functional/apps/spaces/enter_space.ts index 38220c15cb266..d45b8a1ea4cdb 100644 --- a/x-pack/test/functional/apps/spaces/enter_space.ts +++ b/x-pack/test/functional/apps/spaces/enter_space.ts @@ -13,7 +13,7 @@ export default function enterSpaceFunctonalTests({ const PageObjects = getPageObjects(['security', 'spaceSelector']); describe('Enter Space', function() { - this.tags('smoke'); + this.tags('includeFirefox'); before(async () => { await esArchiver.load('spaces/enter_space'); await PageObjects.security.forceLogout(); diff --git a/x-pack/test/functional/apps/spaces/spaces_selection.ts b/x-pack/test/functional/apps/spaces/spaces_selection.ts index 7b4a1e6e2b8a0..b88311597d765 100644 --- a/x-pack/test/functional/apps/spaces/spaces_selection.ts +++ b/x-pack/test/functional/apps/spaces/spaces_selection.ts @@ -21,7 +21,7 @@ export default function spaceSelectorFunctonalTests({ ]); describe('Spaces', function() { - this.tags('smoke'); + this.tags('includeFirefox'); describe('Space Selector', () => { before(async () => { await esArchiver.load('spaces/selector'); diff --git a/x-pack/test/functional/apps/status_page/status_page.ts b/x-pack/test/functional/apps/status_page/status_page.ts index 58551aaaf4112..fa5a0c0aa0402 100644 --- a/x-pack/test/functional/apps/status_page/status_page.ts +++ b/x-pack/test/functional/apps/status_page/status_page.ts @@ -13,7 +13,7 @@ export default function statusPageFunctonalTests({ const PageObjects = getPageObjects(['security', 'statusPage', 'home']); describe('Status Page', function() { - this.tags('smoke'); + this.tags('includeFirefox'); before(async () => await esArchiver.load('empty_kibana')); after(async () => await esArchiver.unload('empty_kibana')); diff --git a/x-pack/test/functional/apps/transform/cloning.ts b/x-pack/test/functional/apps/transform/cloning.ts index e6e12f60f0bcc..4f71d81eacdf8 100644 --- a/x-pack/test/functional/apps/transform/cloning.ts +++ b/x-pack/test/functional/apps/transform/cloning.ts @@ -27,7 +27,6 @@ export default function({ getService }: FtrProviderContext) { const transform = getService('transform'); describe('cloning', function() { - this.tags(['smoke']); const transformConfig = getTransformConfig(); before(async () => { diff --git a/x-pack/test/functional/apps/transform/creation_index_pattern.ts b/x-pack/test/functional/apps/transform/creation_index_pattern.ts index dbdbca0368146..0e61635fb70e4 100644 --- a/x-pack/test/functional/apps/transform/creation_index_pattern.ts +++ b/x-pack/test/functional/apps/transform/creation_index_pattern.ts @@ -18,7 +18,6 @@ export default function({ getService }: FtrProviderContext) { const transform = getService('transform'); describe('creation_index_pattern', function() { - this.tags(['smoke']); before(async () => { await esArchiver.loadIfNeeded('ml/ecommerce'); await transform.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); diff --git a/x-pack/test/functional/apps/transform/creation_saved_search.ts b/x-pack/test/functional/apps/transform/creation_saved_search.ts index fd5673de0d7a7..26aec913e4756 100644 --- a/x-pack/test/functional/apps/transform/creation_saved_search.ts +++ b/x-pack/test/functional/apps/transform/creation_saved_search.ts @@ -18,7 +18,6 @@ export default function({ getService }: FtrProviderContext) { const transform = getService('transform'); describe('creation_saved_search', function() { - this.tags(['smoke']); before(async () => { await esArchiver.loadIfNeeded('ml/farequote'); await transform.testResources.createIndexPatternIfNeeded('ft_farequote', '@timestamp'); diff --git a/x-pack/test/functional/apps/upgrade_assistant/upgrade_assistant.ts b/x-pack/test/functional/apps/upgrade_assistant/upgrade_assistant.ts index 42118f4c63b1f..d2210bee0063d 100644 --- a/x-pack/test/functional/apps/upgrade_assistant/upgrade_assistant.ts +++ b/x-pack/test/functional/apps/upgrade_assistant/upgrade_assistant.ts @@ -14,7 +14,7 @@ export default function upgradeAssistantFunctionalTests({ const PageObjects = getPageObjects(['upgradeAssistant']); describe('Upgrade Checkup', function() { - this.tags('smoke'); + this.tags('includeFirefox'); before(async () => await esArchiver.load('empty_kibana')); after(async () => { await PageObjects.upgradeAssistant.expectTelemetryHasFinish(); diff --git a/x-pack/test/functional/apps/watcher/index.js b/x-pack/test/functional/apps/watcher/index.js index 9f0d5a5de405a..e894a890fdb50 100644 --- a/x-pack/test/functional/apps/watcher/index.js +++ b/x-pack/test/functional/apps/watcher/index.js @@ -6,7 +6,7 @@ export default function({ loadTestFile }) { describe('watcher app', function() { - this.tags(['ciGroup1', 'smoke']); + this.tags(['ciGroup1', 'includeFirefox']); //loadTestFile(require.resolve('./management')); loadTestFile(require.resolve('./watcher_test')); From 18d1af24d43d89b82d67375f097bd9ae0f6c8d6d Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Fri, 24 Apr 2020 14:27:35 -0700 Subject: [PATCH 04/26] Move Rollup out of legacy (#62891) --- .sass-lint.yml | 1 - x-pack/index.js | 2 - x-pack/legacy/plugins/rollup/common/index.ts | 19 -- x-pack/legacy/plugins/rollup/index.ts | 43 ----- x-pack/legacy/plugins/rollup/kibana.json | 15 -- .../server/lib/__tests__/fixtures/jobs.js | 98 ---------- .../call_with_request_factory.ts | 28 --- .../license_pre_routing_factory.test.js | 62 ------ .../license_pre_routing_factory.ts | 43 ----- x-pack/legacy/plugins/rollup/server/plugin.ts | 95 ---------- .../plugins/rollup/server/routes/api/index.ts | 10 - .../server/routes/api/index_patterns.ts | 131 ------------- .../rollup/server/routes/api/indices.ts | 175 ----------------- .../plugins/rollup/server/routes/api/jobs.ts | 178 ------------------ .../rollup/server/routes/api/search.ts | 50 ----- x-pack/legacy/plugins/rollup/server/types.ts | 21 --- x-pack/legacy/plugins/rollup/tsconfig.json | 3 - x-pack/{legacy => }/plugins/rollup/README.md | 16 +- x-pack/plugins/rollup/common/index.ts | 9 + x-pack/plugins/rollup/kibana.json | 15 +- .../sections/job_create/steps_config/index.js | 2 +- .../crud_app/services/track_ui_metric.ts | 3 + .../components/rollup_prompt/rollup_prompt.js | 27 ++- .../server/client/elasticsearch_rollup.ts | 0 .../plugins/rollup/server/collectors/index.ts | 0 .../rollup/server/collectors/register.ts | 0 .../rollup/server/config.ts} | 8 +- x-pack/plugins/rollup/server/index.ts | 10 +- .../server/lib/__tests__/fixtures/index.js | 0 .../server/lib/__tests__/fixtures/jobs.js | 98 ++++++++++ .../lib/__tests__/jobs_compatibility.js | 0 .../rollup/server/lib/format_es_error.ts | 78 ++++++++ .../rollup/server/lib}/is_es_error.ts | 0 .../rollup/server/lib/jobs_compatibility.ts | 0 .../rollup/server/lib/map_capabilities.ts | 0 .../lib/merge_capabilities_with_fields.ts | 0 .../server/lib/search_strategies/index.ts | 0 .../lib/interval_helper.test.js | 0 .../search_strategies/lib/interval_helper.ts | 0 .../register_rollup_search_strategy.test.js | 0 .../register_rollup_search_strategy.ts | 18 +- .../rollup_search_capabilities.test.js | 0 .../rollup_search_capabilities.ts | 2 +- .../rollup_search_request.test.js | 0 .../rollup_search_request.ts | 0 .../rollup_search_strategy.test.js | 0 .../rollup_search_strategy.ts | 14 +- x-pack/plugins/rollup/server/plugin.ts | 138 +++++++++++--- .../rollup/server/rollup_data_enricher.ts | 2 +- .../server/routes/api/index_patterns/index.ts | 12 ++ .../register_fields_for_wildcard_route.ts | 141 ++++++++++++++ .../rollup/server/routes/api/indices/index.ts | 14 ++ .../routes/api/indices/register_get_route.ts | 39 ++++ .../register_validate_index_pattern_route.ts | 142 ++++++++++++++ .../rollup/server/routes/api/jobs/index.ts | 20 ++ .../routes/api/jobs/register_create_route.ts | 49 +++++ .../routes/api/jobs/register_delete_route.ts | 51 +++++ .../routes/api/jobs/register_get_route.ts | 32 ++++ .../routes/api/jobs/register_start_route.ts | 48 +++++ .../routes/api/jobs/register_stop_route.ts | 49 +++++ .../rollup/server/routes/api/search}/index.ts | 9 +- .../api/search/register_search_route.ts | 47 +++++ x-pack/plugins/rollup/server/routes/index.ts | 19 ++ .../rollup/server/services/add_base_path.ts} | 4 +- .../rollup/server/services}/index.ts | 3 +- .../plugins/rollup/server/services/license.ts | 93 +++++++++ .../plugins/rollup/server/shared_imports.ts | 2 +- x-pack/plugins/rollup/server/types.ts | 45 +++++ .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 70 files changed, 1192 insertions(+), 1043 deletions(-) delete mode 100644 x-pack/legacy/plugins/rollup/common/index.ts delete mode 100644 x-pack/legacy/plugins/rollup/index.ts delete mode 100644 x-pack/legacy/plugins/rollup/kibana.json delete mode 100644 x-pack/legacy/plugins/rollup/server/lib/__tests__/fixtures/jobs.js delete mode 100644 x-pack/legacy/plugins/rollup/server/lib/call_with_request_factory/call_with_request_factory.ts delete mode 100644 x-pack/legacy/plugins/rollup/server/lib/license_pre_routing_factory/license_pre_routing_factory.test.js delete mode 100644 x-pack/legacy/plugins/rollup/server/lib/license_pre_routing_factory/license_pre_routing_factory.ts delete mode 100644 x-pack/legacy/plugins/rollup/server/plugin.ts delete mode 100644 x-pack/legacy/plugins/rollup/server/routes/api/index.ts delete mode 100644 x-pack/legacy/plugins/rollup/server/routes/api/index_patterns.ts delete mode 100644 x-pack/legacy/plugins/rollup/server/routes/api/indices.ts delete mode 100644 x-pack/legacy/plugins/rollup/server/routes/api/jobs.ts delete mode 100644 x-pack/legacy/plugins/rollup/server/routes/api/search.ts delete mode 100644 x-pack/legacy/plugins/rollup/server/types.ts delete mode 100644 x-pack/legacy/plugins/rollup/tsconfig.json rename x-pack/{legacy => }/plugins/rollup/README.md (76%) rename x-pack/{legacy => }/plugins/rollup/server/client/elasticsearch_rollup.ts (100%) rename x-pack/{legacy => }/plugins/rollup/server/collectors/index.ts (100%) rename x-pack/{legacy => }/plugins/rollup/server/collectors/register.ts (100%) rename x-pack/{legacy/plugins/rollup/server/lib/is_es_error/index.ts => plugins/rollup/server/config.ts} (53%) rename x-pack/{legacy => }/plugins/rollup/server/lib/__tests__/fixtures/index.js (100%) create mode 100644 x-pack/plugins/rollup/server/lib/__tests__/fixtures/jobs.js rename x-pack/{legacy => }/plugins/rollup/server/lib/__tests__/jobs_compatibility.js (100%) create mode 100644 x-pack/plugins/rollup/server/lib/format_es_error.ts rename x-pack/{legacy/plugins/rollup/server/lib/is_es_error => plugins/rollup/server/lib}/is_es_error.ts (100%) rename x-pack/{legacy => }/plugins/rollup/server/lib/jobs_compatibility.ts (100%) rename x-pack/{legacy => }/plugins/rollup/server/lib/map_capabilities.ts (100%) rename x-pack/{legacy => }/plugins/rollup/server/lib/merge_capabilities_with_fields.ts (100%) rename x-pack/{legacy => }/plugins/rollup/server/lib/search_strategies/index.ts (100%) rename x-pack/{legacy => }/plugins/rollup/server/lib/search_strategies/lib/interval_helper.test.js (100%) rename x-pack/{legacy => }/plugins/rollup/server/lib/search_strategies/lib/interval_helper.ts (100%) rename x-pack/{legacy => }/plugins/rollup/server/lib/search_strategies/register_rollup_search_strategy.test.js (100%) rename x-pack/{legacy => }/plugins/rollup/server/lib/search_strategies/register_rollup_search_strategy.ts (76%) rename x-pack/{legacy => }/plugins/rollup/server/lib/search_strategies/rollup_search_capabilities.test.js (100%) rename x-pack/{legacy => }/plugins/rollup/server/lib/search_strategies/rollup_search_capabilities.ts (98%) rename x-pack/{legacy => }/plugins/rollup/server/lib/search_strategies/rollup_search_request.test.js (100%) rename x-pack/{legacy => }/plugins/rollup/server/lib/search_strategies/rollup_search_request.ts (100%) rename x-pack/{legacy => }/plugins/rollup/server/lib/search_strategies/rollup_search_strategy.test.js (100%) rename x-pack/{legacy => }/plugins/rollup/server/lib/search_strategies/rollup_search_strategy.ts (84%) rename x-pack/{legacy => }/plugins/rollup/server/rollup_data_enricher.ts (92%) create mode 100644 x-pack/plugins/rollup/server/routes/api/index_patterns/index.ts create mode 100644 x-pack/plugins/rollup/server/routes/api/index_patterns/register_fields_for_wildcard_route.ts create mode 100644 x-pack/plugins/rollup/server/routes/api/indices/index.ts create mode 100644 x-pack/plugins/rollup/server/routes/api/indices/register_get_route.ts create mode 100644 x-pack/plugins/rollup/server/routes/api/indices/register_validate_index_pattern_route.ts create mode 100644 x-pack/plugins/rollup/server/routes/api/jobs/index.ts create mode 100644 x-pack/plugins/rollup/server/routes/api/jobs/register_create_route.ts create mode 100644 x-pack/plugins/rollup/server/routes/api/jobs/register_delete_route.ts create mode 100644 x-pack/plugins/rollup/server/routes/api/jobs/register_get_route.ts create mode 100644 x-pack/plugins/rollup/server/routes/api/jobs/register_start_route.ts create mode 100644 x-pack/plugins/rollup/server/routes/api/jobs/register_stop_route.ts rename x-pack/{legacy/plugins/rollup/server => plugins/rollup/server/routes/api/search}/index.ts (51%) create mode 100644 x-pack/plugins/rollup/server/routes/api/search/register_search_route.ts create mode 100644 x-pack/plugins/rollup/server/routes/index.ts rename x-pack/{legacy/plugins/rollup/server/lib/call_with_request_factory/index.ts => plugins/rollup/server/services/add_base_path.ts} (66%) rename x-pack/{legacy/plugins/rollup/server/lib/license_pre_routing_factory => plugins/rollup/server/services}/index.ts (74%) create mode 100644 x-pack/plugins/rollup/server/services/license.ts rename x-pack/{legacy => }/plugins/rollup/server/shared_imports.ts (75%) create mode 100644 x-pack/plugins/rollup/server/types.ts diff --git a/.sass-lint.yml b/.sass-lint.yml index 89735342a2d6f..9b31f3fae6d16 100644 --- a/.sass-lint.yml +++ b/.sass-lint.yml @@ -4,7 +4,6 @@ files: - 'src/legacy/core_plugins/timelion/**/*.s+(a|c)ss' - 'src/legacy/core_plugins/vis_type_vislib/**/*.s+(a|c)ss' - 'src/legacy/core_plugins/vis_type_xy/**/*.s+(a|c)ss' - - 'x-pack/legacy/plugins/rollup/**/*.s+(a|c)ss' - 'x-pack/legacy/plugins/security/**/*.s+(a|c)ss' - 'x-pack/legacy/plugins/canvas/**/*.s+(a|c)ss' - 'x-pack/plugins/triggers_actions_ui/**/*.s+(a|c)ss' diff --git a/x-pack/index.js b/x-pack/index.js index 82a35f1710361..e65f6cf60928e 100644 --- a/x-pack/index.js +++ b/x-pack/index.js @@ -17,7 +17,6 @@ import { spaces } from './legacy/plugins/spaces'; import { canvas } from './legacy/plugins/canvas'; import { infra } from './legacy/plugins/infra'; import { taskManager } from './legacy/plugins/task_manager'; -import { rollup } from './legacy/plugins/rollup'; import { siem } from './legacy/plugins/siem'; import { remoteClusters } from './legacy/plugins/remote_clusters'; import { upgradeAssistant } from './legacy/plugins/upgrade_assistant'; @@ -43,7 +42,6 @@ module.exports = function(kibana) { indexManagement(kibana), infra(kibana), taskManager(kibana), - rollup(kibana), siem(kibana), remoteClusters(kibana), upgradeAssistant(kibana), diff --git a/x-pack/legacy/plugins/rollup/common/index.ts b/x-pack/legacy/plugins/rollup/common/index.ts deleted file mode 100644 index 526af055a3ef6..0000000000000 --- a/x-pack/legacy/plugins/rollup/common/index.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { LICENSE_TYPE_BASIC, LicenseType } from '../../../common/constants'; - -export const PLUGIN = { - ID: 'rollup', - MINIMUM_LICENSE_REQUIRED: LICENSE_TYPE_BASIC as LicenseType, - getI18nName: (i18n: any): string => { - return i18n.translate('xpack.rollupJobs.appName', { - defaultMessage: 'Rollup jobs', - }); - }, -}; - -export * from '../../../../plugins/rollup/common'; diff --git a/x-pack/legacy/plugins/rollup/index.ts b/x-pack/legacy/plugins/rollup/index.ts deleted file mode 100644 index f33ae7cfee0a2..0000000000000 --- a/x-pack/legacy/plugins/rollup/index.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { PluginInitializerContext } from 'src/core/server'; -import { RollupSetup } from '../../../plugins/rollup/server'; -import { PLUGIN } from './common'; -import { plugin } from './server'; - -export function rollup(kibana: any) { - return new kibana.Plugin({ - id: PLUGIN.ID, - configPrefix: 'xpack.rollup', - require: ['kibana', 'elasticsearch', 'xpack_main'], - init(server: any) { - const { core: coreSetup, plugins } = server.newPlatform.setup; - const { usageCollection, visTypeTimeseries, indexManagement } = plugins; - - const rollupSetup = (plugins.rollup as unknown) as RollupSetup; - - const initContext = ({ - config: rollupSetup.__legacy.config, - logger: rollupSetup.__legacy.logger, - } as unknown) as PluginInitializerContext; - - const rollupPluginInstance = plugin(initContext); - - rollupPluginInstance.setup(coreSetup, { - usageCollection, - visTypeTimeseries, - indexManagement, - __LEGACY: { - plugins: { - xpack_main: server.plugins.xpack_main, - rollup: server.plugins[PLUGIN.ID], - }, - }, - }); - }, - }); -} diff --git a/x-pack/legacy/plugins/rollup/kibana.json b/x-pack/legacy/plugins/rollup/kibana.json deleted file mode 100644 index 78458c9218be3..0000000000000 --- a/x-pack/legacy/plugins/rollup/kibana.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "rollup", - "version": "kibana", - "requiredPlugins": [ - "home", - "index_management", - "visTypeTimeseries", - "indexPatternManagement" - ], - "optionalPlugins": [ - "usageCollection" - ], - "server": true, - "ui": false -} diff --git a/x-pack/legacy/plugins/rollup/server/lib/__tests__/fixtures/jobs.js b/x-pack/legacy/plugins/rollup/server/lib/__tests__/fixtures/jobs.js deleted file mode 100644 index eb16b211da3fd..0000000000000 --- a/x-pack/legacy/plugins/rollup/server/lib/__tests__/fixtures/jobs.js +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export const jobs = [ - { - "job_id" : "foo1", - "rollup_index" : "foo_rollup", - "index_pattern" : "foo-*", - "fields" : { - "node" : [ - { - "agg" : "terms" - } - ], - "temperature" : [ - { - "agg" : "min" - }, - { - "agg" : "max" - }, - { - "agg" : "sum" - } - ], - "timestamp" : [ - { - "agg" : "date_histogram", - "time_zone" : "UTC", - "interval" : "1h", - "delay": "7d" - } - ], - "voltage" : [ - { - "agg" : "histogram", - "interval": 5 - }, - { - "agg" : "sum" - } - ] - } - }, - { - "job_id" : "foo2", - "rollup_index" : "foo_rollup", - "index_pattern" : "foo-*", - "fields" : { - "host" : [ - { - "agg" : "terms" - } - ], - "timestamp" : [ - { - "agg" : "date_histogram", - "time_zone" : "UTC", - "interval" : "1h", - "delay": "7d" - } - ], - "voltage" : [ - { - "agg" : "histogram", - "interval": 20 - } - ] - } - }, - { - "job_id" : "foo3", - "rollup_index" : "foo_rollup", - "index_pattern" : "foo-*", - "fields" : { - "timestamp" : [ - { - "agg" : "date_histogram", - "time_zone" : "PST", - "interval" : "1h", - "delay": "7d" - } - ], - "voltage" : [ - { - "agg" : "histogram", - "interval": 5 - }, - { - "agg" : "sum" - } - ] - } - } -]; diff --git a/x-pack/legacy/plugins/rollup/server/lib/call_with_request_factory/call_with_request_factory.ts b/x-pack/legacy/plugins/rollup/server/lib/call_with_request_factory/call_with_request_factory.ts deleted file mode 100644 index 883b3552a7c02..0000000000000 --- a/x-pack/legacy/plugins/rollup/server/lib/call_with_request_factory/call_with_request_factory.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { ElasticsearchServiceSetup } from 'kibana/server'; -import { once } from 'lodash'; -import { elasticsearchJsPlugin } from '../../client/elasticsearch_rollup'; - -const callWithRequest = once((elasticsearchService: ElasticsearchServiceSetup) => { - const config = { plugins: [elasticsearchJsPlugin] }; - return elasticsearchService.createClient('rollup', config); -}); - -export const callWithRequestFactory = ( - elasticsearchService: ElasticsearchServiceSetup, - request: any -) => { - return (...args: any[]) => { - return ( - callWithRequest(elasticsearchService) - .asScoped(request) - // @ts-ignore - .callAsCurrentUser(...args) - ); - }; -}; diff --git a/x-pack/legacy/plugins/rollup/server/lib/license_pre_routing_factory/license_pre_routing_factory.test.js b/x-pack/legacy/plugins/rollup/server/lib/license_pre_routing_factory/license_pre_routing_factory.test.js deleted file mode 100644 index b6cea09e0ea3c..0000000000000 --- a/x-pack/legacy/plugins/rollup/server/lib/license_pre_routing_factory/license_pre_routing_factory.test.js +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { licensePreRoutingFactory } from '.'; -import { - LICENSE_STATUS_VALID, - LICENSE_STATUS_INVALID, -} from '../../../../../common/constants/license_status'; -import { kibanaResponseFactory } from '../../../../../../../src/core/server'; - -describe('licensePreRoutingFactory()', () => { - let mockServer; - let mockLicenseCheckResults; - - beforeEach(() => { - mockServer = { - plugins: { - xpack_main: { - info: { - feature: () => ({ - getLicenseCheckResults: () => mockLicenseCheckResults, - }), - }, - }, - }, - }; - }); - - describe('status is invalid', () => { - beforeEach(() => { - mockLicenseCheckResults = { - status: LICENSE_STATUS_INVALID, - }; - }); - - it('replies with 403', () => { - const routeWithLicenseCheck = licensePreRoutingFactory(mockServer, () => {}); - const stubRequest = {}; - const response = routeWithLicenseCheck({}, stubRequest, kibanaResponseFactory); - expect(response.status).to.be(403); - }); - }); - - describe('status is valid', () => { - beforeEach(() => { - mockLicenseCheckResults = { - status: LICENSE_STATUS_VALID, - }; - }); - - it('replies with nothing', () => { - const routeWithLicenseCheck = licensePreRoutingFactory(mockServer, () => null); - const stubRequest = {}; - const response = routeWithLicenseCheck({}, stubRequest, kibanaResponseFactory); - expect(response).to.be(null); - }); - }); -}); diff --git a/x-pack/legacy/plugins/rollup/server/lib/license_pre_routing_factory/license_pre_routing_factory.ts b/x-pack/legacy/plugins/rollup/server/lib/license_pre_routing_factory/license_pre_routing_factory.ts deleted file mode 100644 index 353510d96a00d..0000000000000 --- a/x-pack/legacy/plugins/rollup/server/lib/license_pre_routing_factory/license_pre_routing_factory.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { - KibanaRequest, - KibanaResponseFactory, - RequestHandler, - RequestHandlerContext, -} from 'src/core/server'; -import { PLUGIN } from '../../../common'; -import { LICENSE_STATUS_VALID } from '../../../../../common/constants/license_status'; -import { ServerShim } from '../../types'; - -export const licensePreRoutingFactory = ( - server: ServerShim, - handler: RequestHandler -): RequestHandler => { - const xpackMainPlugin = server.plugins.xpack_main; - - // License checking and enable/disable logic - return function licensePreRouting( - ctx: RequestHandlerContext, - request: KibanaRequest, - response: KibanaResponseFactory - ) { - const licenseCheckResults = xpackMainPlugin.info.feature(PLUGIN.ID).getLicenseCheckResults(); - const { status } = licenseCheckResults; - - if (status !== LICENSE_STATUS_VALID) { - return response.customError({ - body: { - message: licenseCheckResults.messsage, - }, - statusCode: 403, - }); - } - - return handler(ctx, request, response); - }; -}; diff --git a/x-pack/legacy/plugins/rollup/server/plugin.ts b/x-pack/legacy/plugins/rollup/server/plugin.ts deleted file mode 100644 index 05c22b030fff9..0000000000000 --- a/x-pack/legacy/plugins/rollup/server/plugin.ts +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { CoreSetup, Plugin, PluginInitializerContext, Logger } from 'src/core/server'; -import { first } from 'rxjs/operators'; -import { i18n } from '@kbn/i18n'; - -import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; -import { VisTypeTimeseriesSetup } from 'src/plugins/vis_type_timeseries/server'; -import { IndexManagementPluginSetup } from '../../../../plugins/index_management/server'; -import { registerLicenseChecker } from '../../../server/lib/register_license_checker'; -import { PLUGIN } from '../common'; -import { ServerShim, RouteDependencies } from './types'; - -import { - registerIndicesRoute, - registerFieldsForWildcardRoute, - registerSearchRoute, - registerJobsRoute, -} from './routes/api'; - -import { registerRollupUsageCollector } from './collectors'; - -import { rollupDataEnricher } from './rollup_data_enricher'; -import { registerRollupSearchStrategy } from './lib/search_strategies'; - -export class RollupsServerPlugin implements Plugin { - log: Logger; - - constructor(private readonly initializerContext: PluginInitializerContext) { - this.log = initializerContext.logger.get(); - } - - async setup( - { http, elasticsearch: elasticsearchService }: CoreSetup, - { - __LEGACY: serverShim, - usageCollection, - visTypeTimeseries, - indexManagement, - }: { - __LEGACY: ServerShim; - usageCollection?: UsageCollectionSetup; - visTypeTimeseries?: VisTypeTimeseriesSetup; - indexManagement?: IndexManagementPluginSetup; - } - ) { - const elasticsearch = await elasticsearchService.adminClient; - const router = http.createRouter(); - const routeDependencies: RouteDependencies = { - elasticsearch, - elasticsearchService, - router, - }; - - registerLicenseChecker( - serverShim as any, - PLUGIN.ID, - PLUGIN.getI18nName(i18n), - PLUGIN.MINIMUM_LICENSE_REQUIRED - ); - - registerIndicesRoute(routeDependencies, serverShim); - registerFieldsForWildcardRoute(routeDependencies, serverShim); - registerSearchRoute(routeDependencies, serverShim); - registerJobsRoute(routeDependencies, serverShim); - - if (usageCollection) { - this.initializerContext.config.legacy.globalConfig$ - .pipe(first()) - .toPromise() - .then(config => { - registerRollupUsageCollector(usageCollection, config.kibana.index); - }) - .catch(e => { - this.log.warn(`Registering Rollup collector failed: ${e}`); - }); - } - - if (indexManagement && indexManagement.indexDataEnricher) { - indexManagement.indexDataEnricher.add(rollupDataEnricher); - } - - if (visTypeTimeseries) { - const { addSearchStrategy } = visTypeTimeseries; - registerRollupSearchStrategy(routeDependencies, addSearchStrategy); - } - } - - start() {} - - stop() {} -} diff --git a/x-pack/legacy/plugins/rollup/server/routes/api/index.ts b/x-pack/legacy/plugins/rollup/server/routes/api/index.ts deleted file mode 100644 index 146c3e973f9ea..0000000000000 --- a/x-pack/legacy/plugins/rollup/server/routes/api/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { registerIndicesRoute } from './indices'; -export { registerFieldsForWildcardRoute } from './index_patterns'; -export { registerSearchRoute } from './search'; -export { registerJobsRoute } from './jobs'; diff --git a/x-pack/legacy/plugins/rollup/server/routes/api/index_patterns.ts b/x-pack/legacy/plugins/rollup/server/routes/api/index_patterns.ts deleted file mode 100644 index 2516840bd9537..0000000000000 --- a/x-pack/legacy/plugins/rollup/server/routes/api/index_patterns.ts +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { schema } from '@kbn/config-schema'; -import { RequestHandler } from 'src/core/server'; - -import { indexBy } from 'lodash'; -import { IndexPatternsFetcher } from '../../shared_imports'; -import { RouteDependencies, ServerShim } from '../../types'; -import { callWithRequestFactory } from '../../lib/call_with_request_factory'; -import { isEsError } from '../../lib/is_es_error'; -import { licensePreRoutingFactory } from '../../lib/license_pre_routing_factory'; -import { getCapabilitiesForRollupIndices } from '../../lib/map_capabilities'; -import { mergeCapabilitiesWithFields, Field } from '../../lib/merge_capabilities_with_fields'; - -const parseMetaFields = (metaFields: string | string[]) => { - let parsedFields: string[] = []; - if (typeof metaFields === 'string') { - parsedFields = JSON.parse(metaFields); - } else { - parsedFields = metaFields; - } - return parsedFields; -}; - -const getFieldsForWildcardRequest = async (context: any, request: any, response: any) => { - const { callAsCurrentUser } = context.core.elasticsearch.dataClient; - const indexPatterns = new IndexPatternsFetcher(callAsCurrentUser); - const { pattern, meta_fields: metaFields } = request.query; - - let parsedFields: string[] = []; - try { - parsedFields = parseMetaFields(metaFields); - } catch (error) { - return response.badRequest({ - body: error, - }); - } - - try { - const fields = await indexPatterns.getFieldsForWildcard({ - pattern, - metaFields: parsedFields, - }); - - return response.ok({ - body: { fields }, - headers: { - 'content-type': 'application/json', - }, - }); - } catch (error) { - return response.notFound(); - } -}; - -/** - * Get list of fields for rollup index pattern, in the format of regular index pattern fields - */ -export function registerFieldsForWildcardRoute(deps: RouteDependencies, legacy: ServerShim) { - const handler: RequestHandler = async (ctx, request, response) => { - const { params, meta_fields: metaFields } = request.query; - - try { - // Make call and use field information from response - const { payload } = await getFieldsForWildcardRequest(ctx, request, response); - const fields = payload.fields; - const parsedParams = JSON.parse(params); - const rollupIndex = parsedParams.rollup_index; - const callWithRequest = callWithRequestFactory(deps.elasticsearchService, request); - const rollupFields: Field[] = []; - const fieldsFromFieldCapsApi: { [key: string]: any } = indexBy(fields, 'name'); - const rollupIndexCapabilities = getCapabilitiesForRollupIndices( - await callWithRequest('rollup.rollupIndexCapabilities', { - indexPattern: rollupIndex, - }) - )[rollupIndex].aggs; - // Keep meta fields - metaFields.forEach( - (field: string) => - fieldsFromFieldCapsApi[field] && rollupFields.push(fieldsFromFieldCapsApi[field]) - ); - const mergedRollupFields = mergeCapabilitiesWithFields( - rollupIndexCapabilities, - fieldsFromFieldCapsApi, - rollupFields - ); - return response.ok({ body: { fields: mergedRollupFields } }); - } catch (err) { - if (isEsError(err)) { - return response.customError({ statusCode: err.statusCode, body: err }); - } - return response.internalError({ body: err }); - } - }; - - deps.router.get( - { - path: '/api/index_patterns/rollup/_fields_for_wildcard', - validate: { - query: schema.object({ - pattern: schema.string(), - meta_fields: schema.arrayOf(schema.string(), { - defaultValue: [], - }), - params: schema.string({ - validate(value) { - try { - const params = JSON.parse(value); - const keys = Object.keys(params); - const { rollup_index: rollupIndex } = params; - - if (!rollupIndex) { - return '[request query.params]: "rollup_index" is required'; - } else if (keys.length > 1) { - const invalidParams = keys.filter(key => key !== 'rollup_index'); - return `[request query.params]: ${invalidParams.join(', ')} is not allowed`; - } - } catch (err) { - return '[request query.params]: expected JSON string'; - } - }, - }), - }), - }, - }, - licensePreRoutingFactory(legacy, handler) - ); -} diff --git a/x-pack/legacy/plugins/rollup/server/routes/api/indices.ts b/x-pack/legacy/plugins/rollup/server/routes/api/indices.ts deleted file mode 100644 index e78f09a71876b..0000000000000 --- a/x-pack/legacy/plugins/rollup/server/routes/api/indices.ts +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { schema } from '@kbn/config-schema'; -import { RequestHandler } from 'src/core/server'; -import { callWithRequestFactory } from '../../lib/call_with_request_factory'; -import { isEsError } from '../../lib/is_es_error'; -import { licensePreRoutingFactory } from '../../lib/license_pre_routing_factory'; -import { getCapabilitiesForRollupIndices } from '../../lib/map_capabilities'; -import { API_BASE_PATH } from '../../../common'; -import { RouteDependencies, ServerShim } from '../../types'; - -type NumericField = - | 'long' - | 'integer' - | 'short' - | 'byte' - | 'scaled_float' - | 'double' - | 'float' - | 'half_float'; - -interface FieldCapability { - date?: any; - keyword?: any; - long?: any; - integer?: any; - short?: any; - byte?: any; - double?: any; - float?: any; - half_float?: any; - scaled_float?: any; -} - -interface FieldCapabilities { - fields: FieldCapability[]; -} - -function isNumericField(fieldCapability: FieldCapability) { - const numericTypes = [ - 'long', - 'integer', - 'short', - 'byte', - 'double', - 'float', - 'half_float', - 'scaled_float', - ]; - return numericTypes.some(numericType => fieldCapability[numericType as NumericField] != null); -} - -export function registerIndicesRoute(deps: RouteDependencies, legacy: ServerShim) { - const getIndicesHandler: RequestHandler = async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(deps.elasticsearchService, request); - - try { - const data = await callWithRequest('rollup.rollupIndexCapabilities', { - indexPattern: '_all', - }); - return response.ok({ body: getCapabilitiesForRollupIndices(data) }); - } catch (err) { - if (isEsError(err)) { - return response.customError({ statusCode: err.statusCode, body: err }); - } - return response.internalError({ body: err }); - } - }; - - const validateIndexPatternHandler: RequestHandler = async ( - ctx, - request, - response - ) => { - const callWithRequest = callWithRequestFactory(deps.elasticsearchService, request); - - try { - const { indexPattern } = request.params; - const [fieldCapabilities, rollupIndexCapabilities]: [ - FieldCapabilities, - { [key: string]: any } - ] = await Promise.all([ - callWithRequest('rollup.fieldCapabilities', { indexPattern }), - callWithRequest('rollup.rollupIndexCapabilities', { indexPattern }), - ]); - - const doesMatchIndices = Object.entries(fieldCapabilities.fields).length !== 0; - const doesMatchRollupIndices = Object.entries(rollupIndexCapabilities).length !== 0; - - const dateFields: string[] = []; - const numericFields: string[] = []; - const keywordFields: string[] = []; - - const fieldCapabilitiesEntries = Object.entries(fieldCapabilities.fields); - - fieldCapabilitiesEntries.forEach( - ([fieldName, fieldCapability]: [string, FieldCapability]) => { - if (fieldCapability.date) { - dateFields.push(fieldName); - return; - } - - if (isNumericField(fieldCapability)) { - numericFields.push(fieldName); - return; - } - - if (fieldCapability.keyword) { - keywordFields.push(fieldName); - } - } - ); - - const body = { - doesMatchIndices, - doesMatchRollupIndices, - dateFields, - numericFields, - keywordFields, - }; - - return response.ok({ body }); - } catch (err) { - // 404s are still valid results. - if (err.statusCode === 404) { - const notFoundBody = { - doesMatchIndices: false, - doesMatchRollupIndices: false, - dateFields: [], - numericFields: [], - keywordFields: [], - }; - return response.ok({ body: notFoundBody }); - } - - if (isEsError(err)) { - return response.customError({ statusCode: err.statusCode, body: err }); - } - - return response.internalError({ body: err }); - } - }; - - /** - * Returns a list of all rollup index names - */ - deps.router.get( - { - path: `${API_BASE_PATH}/indices`, - validate: false, - }, - licensePreRoutingFactory(legacy, getIndicesHandler) - ); - - /** - * Returns information on validity of an index pattern for creating a rollup job: - * - Does the index pattern match any indices? - * - Does the index pattern match rollup indices? - * - Which date fields, numeric fields, and keyword fields are available in the matching indices? - */ - deps.router.get( - { - path: `${API_BASE_PATH}/index_pattern_validity/{indexPattern}`, - validate: { - params: schema.object({ - indexPattern: schema.string(), - }), - }, - }, - licensePreRoutingFactory(legacy, validateIndexPatternHandler) - ); -} diff --git a/x-pack/legacy/plugins/rollup/server/routes/api/jobs.ts b/x-pack/legacy/plugins/rollup/server/routes/api/jobs.ts deleted file mode 100644 index e45713e2b807c..0000000000000 --- a/x-pack/legacy/plugins/rollup/server/routes/api/jobs.ts +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { schema } from '@kbn/config-schema'; -import { RequestHandler } from 'src/core/server'; -import { callWithRequestFactory } from '../../lib/call_with_request_factory'; -import { isEsError } from '../../lib/is_es_error'; -import { licensePreRoutingFactory } from '../../lib/license_pre_routing_factory'; -import { API_BASE_PATH } from '../../../common'; -import { RouteDependencies, ServerShim } from '../../types'; - -export function registerJobsRoute(deps: RouteDependencies, legacy: ServerShim) { - const getJobsHandler: RequestHandler = async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(deps.elasticsearchService, request); - - try { - const data = await callWithRequest('rollup.jobs'); - return response.ok({ body: data }); - } catch (err) { - if (isEsError(err)) { - return response.customError({ statusCode: err.statusCode, body: err }); - } - return response.internalError({ body: err }); - } - }; - - const createJobsHandler: RequestHandler = async (ctx, request, response) => { - try { - const { id, ...rest } = request.body.job; - const callWithRequest = callWithRequestFactory(deps.elasticsearchService, request); - // Create job. - await callWithRequest('rollup.createJob', { - id, - body: rest, - }); - // Then request the newly created job. - const results = await callWithRequest('rollup.job', { id }); - return response.ok({ body: results.jobs[0] }); - } catch (err) { - if (isEsError(err)) { - return response.customError({ statusCode: err.statusCode, body: err }); - } - return response.internalError({ body: err }); - } - }; - - const startJobsHandler: RequestHandler = async (ctx, request, response) => { - try { - const { jobIds } = request.body; - const callWithRequest = callWithRequestFactory(deps.elasticsearchService, request); - - const data = await Promise.all( - jobIds.map((id: string) => callWithRequest('rollup.startJob', { id })) - ).then(() => ({ success: true })); - return response.ok({ body: data }); - } catch (err) { - if (isEsError(err)) { - return response.customError({ statusCode: err.statusCode, body: err }); - } - return response.internalError({ body: err }); - } - }; - - const stopJobsHandler: RequestHandler = async (ctx, request, response) => { - try { - const { jobIds } = request.body; - // For our API integration tests we need to wait for the jobs to be stopped - // in order to be able to delete them sequencially. - const { waitForCompletion } = request.query; - const callWithRequest = callWithRequestFactory(deps.elasticsearchService, request); - const stopRollupJob = (id: string) => - callWithRequest('rollup.stopJob', { - id, - waitForCompletion: waitForCompletion === 'true', - }); - const data = await Promise.all(jobIds.map(stopRollupJob)).then(() => ({ success: true })); - return response.ok({ body: data }); - } catch (err) { - if (isEsError(err)) { - return response.customError({ statusCode: err.statusCode, body: err }); - } - return response.internalError({ body: err }); - } - }; - - const deleteJobsHandler: RequestHandler = async (ctx, request, response) => { - try { - const { jobIds } = request.body; - const callWithRequest = callWithRequestFactory(deps.elasticsearchService, request); - const data = await Promise.all( - jobIds.map((id: string) => callWithRequest('rollup.deleteJob', { id })) - ).then(() => ({ success: true })); - return response.ok({ body: data }); - } catch (err) { - // There is an issue opened on ES to handle the following error correctly - // https://github.com/elastic/elasticsearch/issues/42908 - // Until then we'll modify the response here. - if (err.response && err.response.includes('Job must be [STOPPED] before deletion')) { - err.status = 400; - err.statusCode = 400; - err.displayName = 'Bad request'; - err.message = JSON.parse(err.response).task_failures[0].reason.reason; - } - if (isEsError(err)) { - return response.customError({ statusCode: err.statusCode, body: err }); - } - return response.internalError({ body: err }); - } - }; - - deps.router.get( - { - path: `${API_BASE_PATH}/jobs`, - validate: false, - }, - licensePreRoutingFactory(legacy, getJobsHandler) - ); - - deps.router.put( - { - path: `${API_BASE_PATH}/create`, - validate: { - body: schema.object({ - job: schema.object( - { - id: schema.string(), - }, - { unknowns: 'allow' } - ), - }), - }, - }, - licensePreRoutingFactory(legacy, createJobsHandler) - ); - - deps.router.post( - { - path: `${API_BASE_PATH}/start`, - validate: { - body: schema.object({ - jobIds: schema.arrayOf(schema.string()), - }), - query: schema.maybe( - schema.object({ - waitForCompletion: schema.maybe(schema.string()), - }) - ), - }, - }, - licensePreRoutingFactory(legacy, startJobsHandler) - ); - - deps.router.post( - { - path: `${API_BASE_PATH}/stop`, - validate: { - body: schema.object({ - jobIds: schema.arrayOf(schema.string()), - }), - }, - }, - licensePreRoutingFactory(legacy, stopJobsHandler) - ); - - deps.router.post( - { - path: `${API_BASE_PATH}/delete`, - validate: { - body: schema.object({ - jobIds: schema.arrayOf(schema.string()), - }), - }, - }, - licensePreRoutingFactory(legacy, deleteJobsHandler) - ); -} diff --git a/x-pack/legacy/plugins/rollup/server/routes/api/search.ts b/x-pack/legacy/plugins/rollup/server/routes/api/search.ts deleted file mode 100644 index 97999a4b5ce8d..0000000000000 --- a/x-pack/legacy/plugins/rollup/server/routes/api/search.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { schema } from '@kbn/config-schema'; -import { RequestHandler } from 'src/core/server'; -import { callWithRequestFactory } from '../../lib/call_with_request_factory'; -import { isEsError } from '../../lib/is_es_error'; -import { licensePreRoutingFactory } from '../../lib/license_pre_routing_factory'; -import { API_BASE_PATH } from '../../../common'; -import { RouteDependencies, ServerShim } from '../../types'; - -export function registerSearchRoute(deps: RouteDependencies, legacy: ServerShim) { - const handler: RequestHandler = async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(deps.elasticsearchService, request); - try { - const requests = request.body.map(({ index, query }: { index: string; query: any }) => - callWithRequest('rollup.search', { - index, - rest_total_hits_as_int: true, - body: query, - }) - ); - const data = await Promise.all(requests); - return response.ok({ body: data }); - } catch (err) { - if (isEsError(err)) { - return response.customError({ statusCode: err.statusCode, body: err }); - } - return response.internalError({ body: err }); - } - }; - - deps.router.post( - { - path: `${API_BASE_PATH}/search`, - validate: { - body: schema.arrayOf( - schema.object({ - index: schema.string(), - query: schema.any(), - }) - ), - }, - }, - licensePreRoutingFactory(legacy, handler) - ); -} diff --git a/x-pack/legacy/plugins/rollup/server/types.ts b/x-pack/legacy/plugins/rollup/server/types.ts deleted file mode 100644 index bcc6770e9b8ee..0000000000000 --- a/x-pack/legacy/plugins/rollup/server/types.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { IRouter, ElasticsearchServiceSetup, IClusterClient } from 'src/core/server'; -import { XPackMainPlugin } from '../../xpack_main/server/xpack_main'; - -export interface ServerShim { - plugins: { - xpack_main: XPackMainPlugin; - rollup: any; - }; -} - -export interface RouteDependencies { - router: IRouter; - elasticsearchService: ElasticsearchServiceSetup; - elasticsearch: IClusterClient; -} diff --git a/x-pack/legacy/plugins/rollup/tsconfig.json b/x-pack/legacy/plugins/rollup/tsconfig.json deleted file mode 100644 index 618c6c3e97b57..0000000000000 --- a/x-pack/legacy/plugins/rollup/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../../../tsconfig.json" -} diff --git a/x-pack/legacy/plugins/rollup/README.md b/x-pack/plugins/rollup/README.md similarity index 76% rename from x-pack/legacy/plugins/rollup/README.md rename to x-pack/plugins/rollup/README.md index 3647be38b6a09..b43f4d5981409 100644 --- a/x-pack/legacy/plugins/rollup/README.md +++ b/x-pack/plugins/rollup/README.md @@ -14,7 +14,7 @@ The rest of this doc dives into the implementation details of each of the above ## Create and manage rollup jobs -The most straight forward part of this plugin! A new app called Rollup Jobs is registered in the Management section and follows a typical CRUD UI pattern. This app allows users to create, start, stop, clone, and delete rollup jobs. There is no way to edit an existing rollup job; instead, the UI offers a cloning ability. The client-side portion of this app lives [here](../../../plugins/rollup/public/crud_app) and uses endpoints registered [here](server/routes/api/jobs.js). +The most straight forward part of this plugin! A new app called Rollup Jobs is registered in the Management section and follows a typical CRUD UI pattern. This app allows users to create, start, stop, clone, and delete rollup jobs. There is no way to edit an existing rollup job; instead, the UI offers a cloning ability. The client-side portion of this app lives in [public/crud_app](public/crud_app) and uses endpoints registered in [(server/routes/api/jobs](server/routes/api/jobs). Refer to the [Elasticsearch documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/rollup-getting-started.html) to understand rollup indices and how to create rollup jobs. @@ -22,22 +22,22 @@ Refer to the [Elasticsearch documentation](https://www.elastic.co/guide/en/elast Kibana uses index patterns to consume and visualize rollup indices. Typically, Kibana can inspect the indices captured by an index pattern, identify its aggregations and fields, and determine how to consume the data. Rollup indices don't contain this type of information, so we predefine how to consume a rollup index pattern with the type and typeMeta fields on the index pattern saved object. All rollup index patterns have `type` defined as "rollup" and `typeMeta` defined as an object of the index pattern's capabilities. -In the Index Pattern app, the "Create index pattern" button includes a context menu when a rollup index is detected. This menu offers items for creating a standard index pattern and a rollup index pattern. A [rollup config is registered to index pattern creation extension point](../../../plugins/rollup/public/index_pattern_creation/rollup_index_pattern_creation_config.js). The context menu behavior in particular uses the `getIndexPatternCreationOption()` method. When the user chooses to create a rollup index pattern, this config changes the behavior of the index pattern creation wizard: +In the Index Pattern app, the "Create index pattern" button includes a context menu when a rollup index is detected. This menu offers items for creating a standard index pattern and a rollup index pattern. A [rollup config is registered to index pattern creation extension point](public/index_pattern_creation/rollup_index_pattern_creation_config.js). The context menu behavior in particular uses the `getIndexPatternCreationOption()` method. When the user chooses to create a rollup index pattern, this config changes the behavior of the index pattern creation wizard: 1. Adds a `Rollup` badge to rollup indices using `getIndexTags()`. 2. Enforces index pattern rules using `checkIndicesForErrors()`. Rollup index patterns must match **one** rollup index, and optionally, any number of regular indices. A rollup index pattern configured with one or more regular indices is known as a "hybrid" index pattern. This allows the user to visualize historical (rollup) data and live (regular) data in the same visualization. -3. Routes to this plugin's [rollup `_fields_for_wildcard` endpoint](server/routes/api/index_patterns.js), instead of the standard one, using `getFetchForWildcardOptions()`, so that the internal rollup data field names are mapped to the original field names. +3. Routes to this plugin's [rollup `_fields_for_wildcard` endpoint](server/routes/api/index_patterns/register_fields_for_wildcard_route.ts), instead of the standard one, using `getFetchForWildcardOptions()`, so that the internal rollup data field names are mapped to the original field names. 4. Writes additional information about aggregations, fields, histogram interval, and date histogram interval and timezone to the rollup index pattern saved object using `getIndexPatternMappings()`. This collection of information is referred to as its "capabilities". -Once a rollup index pattern is created, it is tagged with `Rollup` in the list of index patterns, and its details page displays capabilities information. This is done by registering [yet another config for the index pattern list](../../../plugins/rollup/public/index_pattern_list/rollup_index_pattern_list_config.js) extension points. +Once a rollup index pattern is created, it is tagged with `Rollup` in the list of index patterns, and its details page displays capabilities information. This is done by registering [yet another config for the index pattern list](public/index_pattern_list/rollup_index_pattern_list_config.js) extension points. ## Create visualizations from rollup index patterns This plugin enables the user to create visualizations from rollup data using the Visualize app, excluding TSVB, Vega, and Timelion. When Visualize sends search requests, this plugin routes the requests to the [Elasticsearch rollup search endpoint](https://www.elastic.co/guide/en/elasticsearch/reference/current/rollup-search.html), which searches the special document structure within rollup indices. The visualization options available to users are based on the capabilities of the rollup index pattern they're visualizing. -Routing to the Elasticsearch rollup search endpoint is done by creating an extension point in Courier, effectively allowing multiple "search strategies" to be registered. A [rollup search strategy](../../../plugins/rollup/public/search/register.js) is registered by this plugin that queries [this plugin's rollup search endpoint](server/routes/api/search.js). +Routing to the Elasticsearch rollup search endpoint is done by creating an extension point in Courier, effectively allowing multiple "search strategies" to be registered. A [rollup search strategy](public/search/register.js) is registered by this plugin that queries [this plugin's rollup search endpoint](server/routes/api/search.js). -Limiting visualization editor options is done by [registering configs](../../../plugins/rollup/public/visualize/index.js) to various vis extension points. These configs use information stored on the rollup index pattern to limit: +Limiting visualization editor options is done by [registering configs](public/visualize/index.js) to various vis extension points. These configs use information stored on the rollup index pattern to limit: * Available aggregation types * Available fields for a particular aggregation * Default and base interval for histogram aggregation @@ -47,6 +47,6 @@ Limiting visualization editor options is done by [registering configs](../../../ In Index Management, similar to system indices, rollup indices are hidden by default. A toggle is provided to show rollup indices and add a badge to the table rows. This is done by using Index Management's extension points. -The toggle and badge are registered on client-side [here](../../../plugins/rollup/public/extend_index_management/index.js). +The toggle and badge are registered on the client-side in [public/extend_index_management](public/extend_index_management). -Additional data needed to filter rollup indices in Index Management is provided with a [data enricher](rollup_data_enricher.js). +Additional data needed to filter rollup indices in Index Management is provided with a [data enricher](rollup_data_enricher.ts). \ No newline at end of file diff --git a/x-pack/plugins/rollup/common/index.ts b/x-pack/plugins/rollup/common/index.ts index aeffa3dc3959f..e94726a6f3d95 100644 --- a/x-pack/plugins/rollup/common/index.ts +++ b/x-pack/plugins/rollup/common/index.ts @@ -4,6 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ +import { LicenseType } from '../../licensing/common/types'; + +const basicLicense: LicenseType = 'basic'; + +export const PLUGIN = { + ID: 'rollup', + minimumLicenseType: basicLicense, +}; + export const CONFIG_ROLLUPS = 'rollups:enableIndexPatterns'; export const API_BASE_PATH = '/api/rollup'; diff --git a/x-pack/plugins/rollup/kibana.json b/x-pack/plugins/rollup/kibana.json index 8f832f6c6a345..4c7dcb48a4d3f 100644 --- a/x-pack/plugins/rollup/kibana.json +++ b/x-pack/plugins/rollup/kibana.json @@ -4,6 +4,17 @@ "kibanaVersion": "kibana", "server": true, "ui": true, - "optionalPlugins": ["home", "indexManagement", "indexPatternManagement", "usageCollection"], - "requiredPlugins": ["management", "data"] + "requiredPlugins": [ + "indexPatternManagement", + "management", + "licensing", + "data" + ], + "optionalPlugins": [ + "home", + "indexManagement", + "usageCollection", + "visTypeTimeseries" + ], + "configPath": ["xpack", "rollup"] } diff --git a/x-pack/plugins/rollup/public/crud_app/sections/job_create/steps_config/index.js b/x-pack/plugins/rollup/public/crud_app/sections/job_create/steps_config/index.js index 4a55c4679c3d8..eca624e16cb86 100644 --- a/x-pack/plugins/rollup/public/crud_app/sections/job_create/steps_config/index.js +++ b/x-pack/plugins/rollup/public/crud_app/sections/job_create/steps_config/index.js @@ -42,7 +42,7 @@ export const stepIds = [ * 1. getDefaultFields: (overrides) => object * 2. fieldValidations * - * See x-pack/plugins/rollup/public/crud_app/services/jobs.js for more information on override's shape + * See rollup/public/crud_app/services/jobs.js for more information on override's shape */ export const stepIdToStepConfigMap = { [STEP_LOGISTICS]: { diff --git a/x-pack/plugins/rollup/public/crud_app/services/track_ui_metric.ts b/x-pack/plugins/rollup/public/crud_app/services/track_ui_metric.ts index aa1cc2dfea323..5d9340a140500 100644 --- a/x-pack/plugins/rollup/public/crud_app/services/track_ui_metric.ts +++ b/x-pack/plugins/rollup/public/crud_app/services/track_ui_metric.ts @@ -16,6 +16,9 @@ export { METRIC_TYPE }; export function trackUserRequest(request: Promise, actionType: string) { // Only track successful actions. return request.then(response => { + // NOTE: METRIC_TYPE.LOADED is probably the wrong metric type here. The correct metric type + // is more likely METRIC_TYPE.APPLICATION_USAGE. This change was introduced in + // https://github.com/elastic/kibana/pull/41113/files#diff-58ac12bdd1a3a05a24e69ff20633c482R20 trackUiMetric(METRIC_TYPE.LOADED, actionType); // We return the response immediately without waiting for the tracking request to resolve, // to avoid adding additional latency. diff --git a/x-pack/plugins/rollup/public/index_pattern_creation/components/rollup_prompt/rollup_prompt.js b/x-pack/plugins/rollup/public/index_pattern_creation/components/rollup_prompt/rollup_prompt.js index 42c950f0b0d74..9d81abf70a55d 100644 --- a/x-pack/plugins/rollup/public/index_pattern_creation/components/rollup_prompt/rollup_prompt.js +++ b/x-pack/plugins/rollup/public/index_pattern_creation/components/rollup_prompt/rollup_prompt.js @@ -5,21 +5,34 @@ */ import React from 'react'; +import { i18n } from '@kbn/i18n'; import { EuiCallOut } from '@elastic/eui'; export const RollupPrompt = () => (

- Kibana's support for rollup index patterns is in beta. You might encounter issues using - these patterns in saved searches, visualizations, and dashboards. They are not supported in - some advanced features, such as Timelion, and Machine Learning. + {i18n.translate( + 'xpack.rollupJobs.editRollupIndexPattern.rollupPrompt.betaCalloutParagraph1Text', + { + defaultMessage: + "Kibana's support for rollup index patterns is in beta. You might encounter issues using " + + 'these patterns in saved searches, visualizations, and dashboards. They are not supported in ' + + 'some advanced features, such as Timelion, and Machine Learning.', + } + )}

- You can match a rollup index pattern against one rollup index and zero or more regular - indices. A rollup index pattern has limited metrics, fields, intervals, and aggregations. A - rollup index is limited to indices that have one job configuration, or multiple jobs with - compatible configurations. + {i18n.translate( + 'xpack.rollupJobs.editRollupIndexPattern.rollupPrompt.betaCalloutParagraph2Text', + { + defaultMessage: + 'You can match a rollup index pattern against one rollup index and zero or more regular ' + + 'indices. A rollup index pattern has limited metrics, fields, intervals, and aggregations. A ' + + 'rollup index is limited to indices that have one job configuration, or multiple jobs with ' + + 'compatible configurations.', + } + )}

); diff --git a/x-pack/legacy/plugins/rollup/server/client/elasticsearch_rollup.ts b/x-pack/plugins/rollup/server/client/elasticsearch_rollup.ts similarity index 100% rename from x-pack/legacy/plugins/rollup/server/client/elasticsearch_rollup.ts rename to x-pack/plugins/rollup/server/client/elasticsearch_rollup.ts diff --git a/x-pack/legacy/plugins/rollup/server/collectors/index.ts b/x-pack/plugins/rollup/server/collectors/index.ts similarity index 100% rename from x-pack/legacy/plugins/rollup/server/collectors/index.ts rename to x-pack/plugins/rollup/server/collectors/index.ts diff --git a/x-pack/legacy/plugins/rollup/server/collectors/register.ts b/x-pack/plugins/rollup/server/collectors/register.ts similarity index 100% rename from x-pack/legacy/plugins/rollup/server/collectors/register.ts rename to x-pack/plugins/rollup/server/collectors/register.ts diff --git a/x-pack/legacy/plugins/rollup/server/lib/is_es_error/index.ts b/x-pack/plugins/rollup/server/config.ts similarity index 53% rename from x-pack/legacy/plugins/rollup/server/lib/is_es_error/index.ts rename to x-pack/plugins/rollup/server/config.ts index a9a3c61472d8c..6d02600521c3a 100644 --- a/x-pack/legacy/plugins/rollup/server/lib/is_es_error/index.ts +++ b/x-pack/plugins/rollup/server/config.ts @@ -4,4 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -export { isEsError } from './is_es_error'; +import { schema, TypeOf } from '@kbn/config-schema'; + +export const configSchema = schema.object({ + enabled: schema.boolean({ defaultValue: true }), +}); + +export type RollupConfig = TypeOf; diff --git a/x-pack/plugins/rollup/server/index.ts b/x-pack/plugins/rollup/server/index.ts index 4056842453776..78859a959a1e0 100644 --- a/x-pack/plugins/rollup/server/index.ts +++ b/x-pack/plugins/rollup/server/index.ts @@ -4,9 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PluginInitializerContext } from 'src/core/server'; +import { PluginInitializerContext, PluginConfigDescriptor } from 'src/core/server'; import { RollupPlugin } from './plugin'; +import { configSchema, RollupConfig } from './config'; -export const plugin = (initContext: PluginInitializerContext) => new RollupPlugin(initContext); +export const plugin = (pluginInitializerContext: PluginInitializerContext) => + new RollupPlugin(pluginInitializerContext); -export { RollupSetup } from './plugin'; +export const config: PluginConfigDescriptor = { + schema: configSchema, +}; diff --git a/x-pack/legacy/plugins/rollup/server/lib/__tests__/fixtures/index.js b/x-pack/plugins/rollup/server/lib/__tests__/fixtures/index.js similarity index 100% rename from x-pack/legacy/plugins/rollup/server/lib/__tests__/fixtures/index.js rename to x-pack/plugins/rollup/server/lib/__tests__/fixtures/index.js diff --git a/x-pack/plugins/rollup/server/lib/__tests__/fixtures/jobs.js b/x-pack/plugins/rollup/server/lib/__tests__/fixtures/jobs.js new file mode 100644 index 0000000000000..c03b7c33abe0a --- /dev/null +++ b/x-pack/plugins/rollup/server/lib/__tests__/fixtures/jobs.js @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export const jobs = [ + { + job_id: 'foo1', + rollup_index: 'foo_rollup', + index_pattern: 'foo-*', + fields: { + node: [ + { + agg: 'terms', + }, + ], + temperature: [ + { + agg: 'min', + }, + { + agg: 'max', + }, + { + agg: 'sum', + }, + ], + timestamp: [ + { + agg: 'date_histogram', + time_zone: 'UTC', + interval: '1h', + delay: '7d', + }, + ], + voltage: [ + { + agg: 'histogram', + interval: 5, + }, + { + agg: 'sum', + }, + ], + }, + }, + { + job_id: 'foo2', + rollup_index: 'foo_rollup', + index_pattern: 'foo-*', + fields: { + host: [ + { + agg: 'terms', + }, + ], + timestamp: [ + { + agg: 'date_histogram', + time_zone: 'UTC', + interval: '1h', + delay: '7d', + }, + ], + voltage: [ + { + agg: 'histogram', + interval: 20, + }, + ], + }, + }, + { + job_id: 'foo3', + rollup_index: 'foo_rollup', + index_pattern: 'foo-*', + fields: { + timestamp: [ + { + agg: 'date_histogram', + time_zone: 'PST', + interval: '1h', + delay: '7d', + }, + ], + voltage: [ + { + agg: 'histogram', + interval: 5, + }, + { + agg: 'sum', + }, + ], + }, + }, +]; diff --git a/x-pack/legacy/plugins/rollup/server/lib/__tests__/jobs_compatibility.js b/x-pack/plugins/rollup/server/lib/__tests__/jobs_compatibility.js similarity index 100% rename from x-pack/legacy/plugins/rollup/server/lib/__tests__/jobs_compatibility.js rename to x-pack/plugins/rollup/server/lib/__tests__/jobs_compatibility.js diff --git a/x-pack/plugins/rollup/server/lib/format_es_error.ts b/x-pack/plugins/rollup/server/lib/format_es_error.ts new file mode 100644 index 0000000000000..9dde027cd6949 --- /dev/null +++ b/x-pack/plugins/rollup/server/lib/format_es_error.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +function extractCausedByChain( + causedBy: Record = {}, + accumulator: string[] = [] +): string[] { + const { reason, caused_by } = causedBy; // eslint-disable-line @typescript-eslint/camelcase + + if (reason) { + accumulator.push(reason); + } + + // eslint-disable-next-line @typescript-eslint/camelcase + if (caused_by) { + return extractCausedByChain(caused_by, accumulator); + } + + return accumulator; +} + +/** + * Wraps an error thrown by the ES JS client into a Boom error response and returns it + * + * @param err Object Error thrown by ES JS client + * @param statusCodeToMessageMap Object Optional map of HTTP status codes => error messages + */ +export function wrapEsError( + err: any, + statusCodeToMessageMap: Record = {} +): { message: string; body?: { cause?: string[] }; statusCode: number } { + const { statusCode, response } = err; + + const { + error: { + root_cause = [], // eslint-disable-line @typescript-eslint/camelcase + caused_by = undefined, // eslint-disable-line @typescript-eslint/camelcase + } = {}, + } = JSON.parse(response); + + // If no custom message if specified for the error's status code, just + // wrap the error as a Boom error response and return it + if (!statusCodeToMessageMap[statusCode]) { + // The caused_by chain has the most information so use that if it's available. If not then + // settle for the root_cause. + const causedByChain = extractCausedByChain(caused_by); + const defaultCause = root_cause.length ? extractCausedByChain(root_cause[0]) : undefined; + + return { + message: err.message, + statusCode, + body: { + cause: causedByChain.length ? causedByChain : defaultCause, + }, + }; + } + + // Otherwise, use the custom message to create a Boom error response and + // return it + const message = statusCodeToMessageMap[statusCode]; + return { message, statusCode }; +} + +export function formatEsError(err: any): any { + const { statusCode, message, body } = wrapEsError(err); + return { + statusCode, + body: { + message, + attributes: { + cause: body?.cause, + }, + }, + }; +} diff --git a/x-pack/legacy/plugins/rollup/server/lib/is_es_error/is_es_error.ts b/x-pack/plugins/rollup/server/lib/is_es_error.ts similarity index 100% rename from x-pack/legacy/plugins/rollup/server/lib/is_es_error/is_es_error.ts rename to x-pack/plugins/rollup/server/lib/is_es_error.ts diff --git a/x-pack/legacy/plugins/rollup/server/lib/jobs_compatibility.ts b/x-pack/plugins/rollup/server/lib/jobs_compatibility.ts similarity index 100% rename from x-pack/legacy/plugins/rollup/server/lib/jobs_compatibility.ts rename to x-pack/plugins/rollup/server/lib/jobs_compatibility.ts diff --git a/x-pack/legacy/plugins/rollup/server/lib/map_capabilities.ts b/x-pack/plugins/rollup/server/lib/map_capabilities.ts similarity index 100% rename from x-pack/legacy/plugins/rollup/server/lib/map_capabilities.ts rename to x-pack/plugins/rollup/server/lib/map_capabilities.ts diff --git a/x-pack/legacy/plugins/rollup/server/lib/merge_capabilities_with_fields.ts b/x-pack/plugins/rollup/server/lib/merge_capabilities_with_fields.ts similarity index 100% rename from x-pack/legacy/plugins/rollup/server/lib/merge_capabilities_with_fields.ts rename to x-pack/plugins/rollup/server/lib/merge_capabilities_with_fields.ts diff --git a/x-pack/legacy/plugins/rollup/server/lib/search_strategies/index.ts b/x-pack/plugins/rollup/server/lib/search_strategies/index.ts similarity index 100% rename from x-pack/legacy/plugins/rollup/server/lib/search_strategies/index.ts rename to x-pack/plugins/rollup/server/lib/search_strategies/index.ts diff --git a/x-pack/legacy/plugins/rollup/server/lib/search_strategies/lib/interval_helper.test.js b/x-pack/plugins/rollup/server/lib/search_strategies/lib/interval_helper.test.js similarity index 100% rename from x-pack/legacy/plugins/rollup/server/lib/search_strategies/lib/interval_helper.test.js rename to x-pack/plugins/rollup/server/lib/search_strategies/lib/interval_helper.test.js diff --git a/x-pack/legacy/plugins/rollup/server/lib/search_strategies/lib/interval_helper.ts b/x-pack/plugins/rollup/server/lib/search_strategies/lib/interval_helper.ts similarity index 100% rename from x-pack/legacy/plugins/rollup/server/lib/search_strategies/lib/interval_helper.ts rename to x-pack/plugins/rollup/server/lib/search_strategies/lib/interval_helper.ts diff --git a/x-pack/legacy/plugins/rollup/server/lib/search_strategies/register_rollup_search_strategy.test.js b/x-pack/plugins/rollup/server/lib/search_strategies/register_rollup_search_strategy.test.js similarity index 100% rename from x-pack/legacy/plugins/rollup/server/lib/search_strategies/register_rollup_search_strategy.test.js rename to x-pack/plugins/rollup/server/lib/search_strategies/register_rollup_search_strategy.test.js diff --git a/x-pack/legacy/plugins/rollup/server/lib/search_strategies/register_rollup_search_strategy.ts b/x-pack/plugins/rollup/server/lib/search_strategies/register_rollup_search_strategy.ts similarity index 76% rename from x-pack/legacy/plugins/rollup/server/lib/search_strategies/register_rollup_search_strategy.ts rename to x-pack/plugins/rollup/server/lib/search_strategies/register_rollup_search_strategy.ts index 93c4c1b52140b..333863979ba95 100644 --- a/x-pack/legacy/plugins/rollup/server/lib/search_strategies/register_rollup_search_strategy.ts +++ b/x-pack/plugins/rollup/server/lib/search_strategies/register_rollup_search_strategy.ts @@ -3,18 +3,19 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { getRollupSearchStrategy } from './rollup_search_strategy'; -import { getRollupSearchRequest } from './rollup_search_request'; -import { getRollupSearchCapabilities } from './rollup_search_capabilities'; + import { AbstractSearchRequest, DefaultSearchCapabilities, AbstractSearchStrategy, -} from '../../../../../../../src/plugins/vis_type_timeseries/server'; -import { RouteDependencies } from '../../types'; +} from '../../../../../../src/plugins/vis_type_timeseries/server'; +import { CallWithRequestFactoryShim } from '../../types'; +import { getRollupSearchStrategy } from './rollup_search_strategy'; +import { getRollupSearchRequest } from './rollup_search_request'; +import { getRollupSearchCapabilities } from './rollup_search_capabilities'; export const registerRollupSearchStrategy = ( - { elasticsearchService }: RouteDependencies, + callWithRequestFactory: CallWithRequestFactoryShim, addSearchStrategy: (searchStrategy: any) => void ) => { const RollupSearchRequest = getRollupSearchRequest(AbstractSearchRequest); @@ -22,8 +23,9 @@ export const registerRollupSearchStrategy = ( const RollupSearchStrategy = getRollupSearchStrategy( AbstractSearchStrategy, RollupSearchRequest, - RollupSearchCapabilities + RollupSearchCapabilities, + callWithRequestFactory ); - addSearchStrategy(new RollupSearchStrategy(elasticsearchService)); + addSearchStrategy(new RollupSearchStrategy()); }; diff --git a/x-pack/legacy/plugins/rollup/server/lib/search_strategies/rollup_search_capabilities.test.js b/x-pack/plugins/rollup/server/lib/search_strategies/rollup_search_capabilities.test.js similarity index 100% rename from x-pack/legacy/plugins/rollup/server/lib/search_strategies/rollup_search_capabilities.test.js rename to x-pack/plugins/rollup/server/lib/search_strategies/rollup_search_capabilities.test.js diff --git a/x-pack/legacy/plugins/rollup/server/lib/search_strategies/rollup_search_capabilities.ts b/x-pack/plugins/rollup/server/lib/search_strategies/rollup_search_capabilities.ts similarity index 98% rename from x-pack/legacy/plugins/rollup/server/lib/search_strategies/rollup_search_capabilities.ts rename to x-pack/plugins/rollup/server/lib/search_strategies/rollup_search_capabilities.ts index 5a57129aa6039..151afe660847f 100644 --- a/x-pack/legacy/plugins/rollup/server/lib/search_strategies/rollup_search_capabilities.ts +++ b/x-pack/plugins/rollup/server/lib/search_strategies/rollup_search_capabilities.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import { get, has } from 'lodash'; -import { KibanaRequest } from 'kibana/server'; +import { KibanaRequest } from 'src/core/server'; import { leastCommonInterval, isCalendarInterval } from './lib/interval_helper'; export const getRollupSearchCapabilities = (DefaultSearchCapabilities: any) => diff --git a/x-pack/legacy/plugins/rollup/server/lib/search_strategies/rollup_search_request.test.js b/x-pack/plugins/rollup/server/lib/search_strategies/rollup_search_request.test.js similarity index 100% rename from x-pack/legacy/plugins/rollup/server/lib/search_strategies/rollup_search_request.test.js rename to x-pack/plugins/rollup/server/lib/search_strategies/rollup_search_request.test.js diff --git a/x-pack/legacy/plugins/rollup/server/lib/search_strategies/rollup_search_request.ts b/x-pack/plugins/rollup/server/lib/search_strategies/rollup_search_request.ts similarity index 100% rename from x-pack/legacy/plugins/rollup/server/lib/search_strategies/rollup_search_request.ts rename to x-pack/plugins/rollup/server/lib/search_strategies/rollup_search_request.ts diff --git a/x-pack/legacy/plugins/rollup/server/lib/search_strategies/rollup_search_strategy.test.js b/x-pack/plugins/rollup/server/lib/search_strategies/rollup_search_strategy.test.js similarity index 100% rename from x-pack/legacy/plugins/rollup/server/lib/search_strategies/rollup_search_strategy.test.js rename to x-pack/plugins/rollup/server/lib/search_strategies/rollup_search_strategy.test.js diff --git a/x-pack/legacy/plugins/rollup/server/lib/search_strategies/rollup_search_strategy.ts b/x-pack/plugins/rollup/server/lib/search_strategies/rollup_search_strategy.ts similarity index 84% rename from x-pack/legacy/plugins/rollup/server/lib/search_strategies/rollup_search_strategy.ts rename to x-pack/plugins/rollup/server/lib/search_strategies/rollup_search_strategy.ts index 9d5aad2c2d3bc..815fe163411b3 100644 --- a/x-pack/legacy/plugins/rollup/server/lib/search_strategies/rollup_search_strategy.ts +++ b/x-pack/plugins/rollup/server/lib/search_strategies/rollup_search_strategy.ts @@ -4,8 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ import { indexBy, isString } from 'lodash'; -import { ElasticsearchServiceSetup, KibanaRequest } from 'kibana/server'; -import { callWithRequestFactory } from '../call_with_request_factory'; +import { KibanaRequest } from 'src/core/server'; + +import { CallWithRequestFactoryShim } from '../../types'; import { mergeCapabilitiesWithFields } from '../merge_capabilities_with_fields'; import { getCapabilitiesForRollupIndices } from '../map_capabilities'; @@ -20,13 +21,16 @@ const isIndexPatternValid = (indexPattern: string) => export const getRollupSearchStrategy = ( AbstractSearchStrategy: any, RollupSearchRequest: any, - RollupSearchCapabilities: any + RollupSearchCapabilities: any, + callWithRequestFactory: CallWithRequestFactoryShim ) => class RollupSearchStrategy extends AbstractSearchStrategy { name = 'rollup'; - constructor(elasticsearchService: ElasticsearchServiceSetup) { - super(elasticsearchService, callWithRequestFactory, RollupSearchRequest); + constructor() { + // TODO: When vis_type_timeseries and AbstractSearchStrategy are migrated to the NP, it + // shouldn't require elasticsearchService to be injected, and we can remove this null argument. + super(null, callWithRequestFactory, RollupSearchRequest); } getRollupData(req: KibanaRequest, indexPattern: string) { diff --git a/x-pack/plugins/rollup/server/plugin.ts b/x-pack/plugins/rollup/server/plugin.ts index ea6d197e22029..ee9a1844c7468 100644 --- a/x-pack/plugins/rollup/server/plugin.ts +++ b/x-pack/plugins/rollup/server/plugin.ts @@ -4,20 +4,98 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CoreSetup, Plugin, PluginInitializerContext } from 'src/core/server'; +declare module 'src/core/server' { + interface RequestHandlerContext { + rollup?: RollupContext; + } +} + +import { Observable } from 'rxjs'; +import { first } from 'rxjs/operators'; +import { + CoreSetup, + Plugin, + Logger, + KibanaRequest, + PluginInitializerContext, + IScopedClusterClient, + APICaller, + SharedGlobalConfig, +} from 'src/core/server'; import { i18n } from '@kbn/i18n'; import { schema } from '@kbn/config-schema'; -import { CONFIG_ROLLUPS } from '../common'; -export class RollupPlugin implements Plugin { - private readonly initContext: PluginInitializerContext; +import { PLUGIN, CONFIG_ROLLUPS } from '../common'; +import { Dependencies, CallWithRequestFactoryShim } from './types'; +import { registerApiRoutes } from './routes'; +import { License } from './services'; +import { registerRollupUsageCollector } from './collectors'; +import { rollupDataEnricher } from './rollup_data_enricher'; +import { IndexPatternsFetcher } from './shared_imports'; +import { registerRollupSearchStrategy } from './lib/search_strategies'; +import { elasticsearchJsPlugin } from './client/elasticsearch_rollup'; +import { isEsError } from './lib/is_es_error'; +import { formatEsError } from './lib/format_es_error'; +import { getCapabilitiesForRollupIndices } from './lib/map_capabilities'; +import { mergeCapabilitiesWithFields } from './lib/merge_capabilities_with_fields'; + +interface RollupContext { + client: IScopedClusterClient; +} + +export class RollupPlugin implements Plugin { + private readonly logger: Logger; + private readonly globalConfig$: Observable; + private readonly license: License; - constructor(initContext: PluginInitializerContext) { - this.initContext = initContext; + constructor(initializerContext: PluginInitializerContext) { + this.logger = initializerContext.logger.get(); + this.globalConfig$ = initializerContext.config.legacy.globalConfig$; + this.license = new License(); } - public setup(core: CoreSetup) { - core.uiSettings.register({ + public setup( + { http, uiSettings, elasticsearch }: CoreSetup, + { licensing, indexManagement, visTypeTimeseries, usageCollection }: Dependencies + ) { + this.license.setup( + { + pluginId: PLUGIN.ID, + minimumLicenseType: PLUGIN.minimumLicenseType, + defaultErrorMessage: i18n.translate('xpack.rollupJobs.licenseCheckErrorMessage', { + defaultMessage: 'License check failed', + }), + }, + { + licensing, + logger: this.logger, + } + ); + + // Extend the elasticsearchJs client with additional endpoints. + const esClientConfig = { plugins: [elasticsearchJsPlugin] }; + const rollupEsClient = elasticsearch.createClient('rollup', esClientConfig); + http.registerRouteHandlerContext('rollup', (context, request) => { + return { + client: rollupEsClient.asScoped(request), + }; + }); + + registerApiRoutes({ + router: http.createRouter(), + license: this.license, + lib: { + isEsError, + formatEsError, + getCapabilitiesForRollupIndices, + mergeCapabilitiesWithFields, + }, + sharedImports: { + IndexPatternsFetcher, + }, + }); + + uiSettings.register({ [CONFIG_ROLLUPS]: { name: i18n.translate('xpack.rollupJobs.rollupIndexPatternsTitle', { defaultMessage: 'Enable rollup index patterns', @@ -33,22 +111,34 @@ export class RollupPlugin implements Plugin { }, }); - return { - __legacy: { - config: this.initContext.config, - logger: this.initContext.logger, - }, - }; - } + if (visTypeTimeseries) { + // TODO: When vis_type_timeseries is fully migrated to the NP, it shouldn't require this shim. + const callWithRequestFactoryShim = ( + elasticsearchServiceShim: CallWithRequestFactoryShim, + request: KibanaRequest + ): APICaller => rollupEsClient.asScoped(request).callAsCurrentUser; - public start() {} - public stop() {} -} + const { addSearchStrategy } = visTypeTimeseries; + registerRollupSearchStrategy(callWithRequestFactoryShim, addSearchStrategy); + } + + if (usageCollection) { + this.globalConfig$ + .pipe(first()) + .toPromise() + .then(globalConfig => { + registerRollupUsageCollector(usageCollection, globalConfig.kibana.index); + }) + .catch((e: any) => { + this.logger.warn(`Registering Rollup collector failed: ${e}`); + }); + } + + if (indexManagement && indexManagement.indexDataEnricher) { + indexManagement.indexDataEnricher.add(rollupDataEnricher); + } + } -export interface RollupSetup { - /** @deprecated */ - __legacy: { - config: PluginInitializerContext['config']; - logger: PluginInitializerContext['logger']; - }; + start() {} + stop() {} } diff --git a/x-pack/legacy/plugins/rollup/server/rollup_data_enricher.ts b/x-pack/plugins/rollup/server/rollup_data_enricher.ts similarity index 92% rename from x-pack/legacy/plugins/rollup/server/rollup_data_enricher.ts rename to x-pack/plugins/rollup/server/rollup_data_enricher.ts index ad621f2d9ba80..b06cf971a6460 100644 --- a/x-pack/legacy/plugins/rollup/server/rollup_data_enricher.ts +++ b/x-pack/plugins/rollup/server/rollup_data_enricher.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Index } from '../../../../plugins/index_management/server'; +import { Index } from '../../../plugins/index_management/server'; export const rollupDataEnricher = async (indicesList: Index[], callWithRequest: any) => { if (!indicesList || !indicesList.length) { diff --git a/x-pack/plugins/rollup/server/routes/api/index_patterns/index.ts b/x-pack/plugins/rollup/server/routes/api/index_patterns/index.ts new file mode 100644 index 0000000000000..7bf525ca4aa98 --- /dev/null +++ b/x-pack/plugins/rollup/server/routes/api/index_patterns/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { RouteDependencies } from '../../../types'; +import { registerFieldsForWildcardRoute } from './register_fields_for_wildcard_route'; + +export function registerIndexPatternsRoutes(dependencies: RouteDependencies) { + registerFieldsForWildcardRoute(dependencies); +} diff --git a/x-pack/plugins/rollup/server/routes/api/index_patterns/register_fields_for_wildcard_route.ts b/x-pack/plugins/rollup/server/routes/api/index_patterns/register_fields_for_wildcard_route.ts new file mode 100644 index 0000000000000..32f23314c5259 --- /dev/null +++ b/x-pack/plugins/rollup/server/routes/api/index_patterns/register_fields_for_wildcard_route.ts @@ -0,0 +1,141 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { indexBy } from 'lodash'; +import { schema } from '@kbn/config-schema'; +import { Field } from '../../../lib/merge_capabilities_with_fields'; +import { RouteDependencies } from '../../../types'; + +const parseMetaFields = (metaFields: string | string[]) => { + let parsedFields: string[] = []; + if (typeof metaFields === 'string') { + parsedFields = JSON.parse(metaFields); + } else { + parsedFields = metaFields; + } + return parsedFields; +}; + +const getFieldsForWildcardRequest = async ( + context: any, + request: any, + response: any, + IndexPatternsFetcher: any +) => { + const { callAsCurrentUser } = context.core.elasticsearch.dataClient; + const indexPatterns = new IndexPatternsFetcher(callAsCurrentUser); + const { pattern, meta_fields: metaFields } = request.query; + + let parsedFields: string[] = []; + try { + parsedFields = parseMetaFields(metaFields); + } catch (error) { + return response.badRequest({ + body: error, + }); + } + + try { + const fields = await indexPatterns.getFieldsForWildcard({ + pattern, + metaFields: parsedFields, + }); + + return response.ok({ + body: { fields }, + headers: { + 'content-type': 'application/json', + }, + }); + } catch (error) { + return response.notFound(); + } +}; + +/** + * Get list of fields for rollup index pattern, in the format of regular index pattern fields + */ +export const registerFieldsForWildcardRoute = ({ + router, + license, + lib: { isEsError, formatEsError, getCapabilitiesForRollupIndices, mergeCapabilitiesWithFields }, + sharedImports: { IndexPatternsFetcher }, +}: RouteDependencies) => { + const querySchema = schema.object({ + pattern: schema.string(), + meta_fields: schema.arrayOf(schema.string(), { + defaultValue: [], + }), + params: schema.string({ + validate(value) { + try { + const params = JSON.parse(value); + const keys = Object.keys(params); + const { rollup_index: rollupIndex } = params; + + if (!rollupIndex) { + return '[request query.params]: "rollup_index" is required'; + } else if (keys.length > 1) { + const invalidParams = keys.filter(key => key !== 'rollup_index'); + return `[request query.params]: ${invalidParams.join(', ')} is not allowed`; + } + } catch (err) { + return '[request query.params]: expected JSON string'; + } + }, + }), + }); + + router.get( + { + path: '/api/index_patterns/rollup/_fields_for_wildcard', + validate: { + query: querySchema, + }, + }, + license.guardApiRoute(async (context, request, response) => { + const { params, meta_fields: metaFields } = request.query; + + try { + // Make call and use field information from response + const { payload } = await getFieldsForWildcardRequest( + context, + request, + response, + IndexPatternsFetcher + ); + const fields = payload.fields; + const parsedParams = JSON.parse(params); + const rollupIndex = parsedParams.rollup_index; + const rollupFields: Field[] = []; + const fieldsFromFieldCapsApi: { [key: string]: any } = indexBy(fields, 'name'); + const rollupIndexCapabilities = getCapabilitiesForRollupIndices( + await context.rollup!.client.callAsCurrentUser('rollup.rollupIndexCapabilities', { + indexPattern: rollupIndex, + }) + )[rollupIndex].aggs; + + // Keep meta fields + metaFields.forEach( + (field: string) => + fieldsFromFieldCapsApi[field] && rollupFields.push(fieldsFromFieldCapsApi[field]) + ); + + const mergedRollupFields = mergeCapabilitiesWithFields( + rollupIndexCapabilities, + fieldsFromFieldCapsApi, + rollupFields + ); + return response.ok({ body: { fields: mergedRollupFields } }); + } catch (err) { + if (isEsError(err)) { + return response.customError({ statusCode: err.statusCode, body: err }); + } + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/rollup/server/routes/api/indices/index.ts b/x-pack/plugins/rollup/server/routes/api/indices/index.ts new file mode 100644 index 0000000000000..0aa5772b56991 --- /dev/null +++ b/x-pack/plugins/rollup/server/routes/api/indices/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { RouteDependencies } from '../../../types'; +import { registerGetRoute } from './register_get_route'; +import { registerValidateIndexPatternRoute } from './register_validate_index_pattern_route'; + +export function registerIndicesRoutes(dependencies: RouteDependencies) { + registerGetRoute(dependencies); + registerValidateIndexPatternRoute(dependencies); +} diff --git a/x-pack/plugins/rollup/server/routes/api/indices/register_get_route.ts b/x-pack/plugins/rollup/server/routes/api/indices/register_get_route.ts new file mode 100644 index 0000000000000..3521650c1dc3e --- /dev/null +++ b/x-pack/plugins/rollup/server/routes/api/indices/register_get_route.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +/** + * Returns a list of all rollup index names + */ +export const registerGetRoute = ({ + router, + license, + lib: { isEsError, formatEsError, getCapabilitiesForRollupIndices }, +}: RouteDependencies) => { + router.get( + { + path: addBasePath('/indices'), + validate: false, + }, + license.guardApiRoute(async (context, request, response) => { + try { + const data = await context.rollup!.client.callAsCurrentUser( + 'rollup.rollupIndexCapabilities', + { + indexPattern: '_all', + } + ); + return response.ok({ body: getCapabilitiesForRollupIndices(data) }); + } catch (err) { + if (isEsError(err)) { + return response.customError({ statusCode: err.statusCode, body: err }); + } + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/rollup/server/routes/api/indices/register_validate_index_pattern_route.ts b/x-pack/plugins/rollup/server/routes/api/indices/register_validate_index_pattern_route.ts new file mode 100644 index 0000000000000..9e22060b9beb7 --- /dev/null +++ b/x-pack/plugins/rollup/server/routes/api/indices/register_validate_index_pattern_route.ts @@ -0,0 +1,142 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +type NumericField = + | 'long' + | 'integer' + | 'short' + | 'byte' + | 'scaled_float' + | 'double' + | 'float' + | 'half_float'; + +interface FieldCapability { + date?: any; + keyword?: any; + long?: any; + integer?: any; + short?: any; + byte?: any; + double?: any; + float?: any; + half_float?: any; + scaled_float?: any; +} + +interface FieldCapabilities { + fields: FieldCapability[]; +} + +function isNumericField(fieldCapability: FieldCapability) { + const numericTypes = [ + 'long', + 'integer', + 'short', + 'byte', + 'double', + 'float', + 'half_float', + 'scaled_float', + ]; + return numericTypes.some(numericType => fieldCapability[numericType as NumericField] != null); +} + +/** + * Returns information on validity of an index pattern for creating a rollup job: + * - Does the index pattern match any indices? + * - Does the index pattern match rollup indices? + * - Which date fields, numeric fields, and keyword fields are available in the matching indices? + */ +export const registerValidateIndexPatternRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + router.get( + { + path: addBasePath('/index_pattern_validity/{indexPattern}'), + validate: { + params: schema.object({ + indexPattern: schema.string(), + }), + }, + }, + license.guardApiRoute(async (context, request, response) => { + try { + const { indexPattern } = request.params; + const [fieldCapabilities, rollupIndexCapabilities]: [ + FieldCapabilities, + { [key: string]: any } + ] = await Promise.all([ + context.rollup!.client.callAsCurrentUser('rollup.fieldCapabilities', { indexPattern }), + context.rollup!.client.callAsCurrentUser('rollup.rollupIndexCapabilities', { + indexPattern, + }), + ]); + + const doesMatchIndices = Object.entries(fieldCapabilities.fields).length !== 0; + const doesMatchRollupIndices = Object.entries(rollupIndexCapabilities).length !== 0; + + const dateFields: string[] = []; + const numericFields: string[] = []; + const keywordFields: string[] = []; + + const fieldCapabilitiesEntries = Object.entries(fieldCapabilities.fields); + + fieldCapabilitiesEntries.forEach( + ([fieldName, fieldCapability]: [string, FieldCapability]) => { + if (fieldCapability.date) { + dateFields.push(fieldName); + return; + } + + if (isNumericField(fieldCapability)) { + numericFields.push(fieldName); + return; + } + + if (fieldCapability.keyword) { + keywordFields.push(fieldName); + } + } + ); + + const body = { + doesMatchIndices, + doesMatchRollupIndices, + dateFields, + numericFields, + keywordFields, + }; + + return response.ok({ body }); + } catch (err) { + // 404s are still valid results. + if (err.statusCode === 404) { + const notFoundBody = { + doesMatchIndices: false, + doesMatchRollupIndices: false, + dateFields: [], + numericFields: [], + keywordFields: [], + }; + return response.ok({ body: notFoundBody }); + } + + if (isEsError(err)) { + return response.customError({ statusCode: err.statusCode, body: err }); + } + + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/rollup/server/routes/api/jobs/index.ts b/x-pack/plugins/rollup/server/routes/api/jobs/index.ts new file mode 100644 index 0000000000000..fe1d1c6109a88 --- /dev/null +++ b/x-pack/plugins/rollup/server/routes/api/jobs/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { RouteDependencies } from '../../../types'; +import { registerCreateRoute } from './register_create_route'; +import { registerDeleteRoute } from './register_delete_route'; +import { registerGetRoute } from './register_get_route'; +import { registerStartRoute } from './register_start_route'; +import { registerStopRoute } from './register_stop_route'; + +export function registerJobsRoutes(dependencies: RouteDependencies) { + registerCreateRoute(dependencies); + registerDeleteRoute(dependencies); + registerGetRoute(dependencies); + registerStartRoute(dependencies); + registerStopRoute(dependencies); +} diff --git a/x-pack/plugins/rollup/server/routes/api/jobs/register_create_route.ts b/x-pack/plugins/rollup/server/routes/api/jobs/register_create_route.ts new file mode 100644 index 0000000000000..adf8c1da0af0e --- /dev/null +++ b/x-pack/plugins/rollup/server/routes/api/jobs/register_create_route.ts @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +export const registerCreateRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + router.put( + { + path: addBasePath('/create'), + validate: { + body: schema.object({ + job: schema.object( + { + id: schema.string(), + }, + { unknowns: 'allow' } + ), + }), + }, + }, + license.guardApiRoute(async (context, request, response) => { + try { + const { id, ...rest } = request.body.job; + // Create job. + await context.rollup!.client.callAsCurrentUser('rollup.createJob', { + id, + body: rest, + }); + // Then request the newly created job. + const results = await context.rollup!.client.callAsCurrentUser('rollup.job', { id }); + return response.ok({ body: results.jobs[0] }); + } catch (err) { + if (isEsError(err)) { + return response.customError({ statusCode: err.statusCode, body: err }); + } + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/rollup/server/routes/api/jobs/register_delete_route.ts b/x-pack/plugins/rollup/server/routes/api/jobs/register_delete_route.ts new file mode 100644 index 0000000000000..32f7b3f35e163 --- /dev/null +++ b/x-pack/plugins/rollup/server/routes/api/jobs/register_delete_route.ts @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +export const registerDeleteRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + router.post( + { + path: addBasePath('/delete'), + validate: { + body: schema.object({ + jobIds: schema.arrayOf(schema.string()), + }), + }, + }, + license.guardApiRoute(async (context, request, response) => { + try { + const { jobIds } = request.body; + const data = await Promise.all( + jobIds.map((id: string) => + context.rollup!.client.callAsCurrentUser('rollup.deleteJob', { id }) + ) + ).then(() => ({ success: true })); + return response.ok({ body: data }); + } catch (err) { + // There is an issue opened on ES to handle the following error correctly + // https://github.com/elastic/elasticsearch/issues/42908 + // Until then we'll modify the response here. + if (err.response && err.response.includes('Job must be [STOPPED] before deletion')) { + err.status = 400; + err.statusCode = 400; + err.displayName = 'Bad request'; + err.message = JSON.parse(err.response).task_failures[0].reason.reason; + } + if (isEsError(err)) { + return response.customError({ statusCode: err.statusCode, body: err }); + } + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/rollup/server/routes/api/jobs/register_get_route.ts b/x-pack/plugins/rollup/server/routes/api/jobs/register_get_route.ts new file mode 100644 index 0000000000000..a8d51f4639fc6 --- /dev/null +++ b/x-pack/plugins/rollup/server/routes/api/jobs/register_get_route.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +export const registerGetRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + router.get( + { + path: addBasePath('/jobs'), + validate: false, + }, + license.guardApiRoute(async (context, request, response) => { + try { + const data = await context.rollup!.client.callAsCurrentUser('rollup.jobs'); + return response.ok({ body: data }); + } catch (err) { + if (isEsError(err)) { + return response.customError({ statusCode: err.statusCode, body: err }); + } + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/rollup/server/routes/api/jobs/register_start_route.ts b/x-pack/plugins/rollup/server/routes/api/jobs/register_start_route.ts new file mode 100644 index 0000000000000..fb6f2b12ba52e --- /dev/null +++ b/x-pack/plugins/rollup/server/routes/api/jobs/register_start_route.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +export const registerStartRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + router.post( + { + path: addBasePath('/start'), + validate: { + body: schema.object({ + jobIds: schema.arrayOf(schema.string()), + }), + query: schema.maybe( + schema.object({ + waitForCompletion: schema.maybe(schema.string()), + }) + ), + }, + }, + license.guardApiRoute(async (context, request, response) => { + try { + const { jobIds } = request.body; + + const data = await Promise.all( + jobIds.map((id: string) => + context.rollup!.client.callAsCurrentUser('rollup.startJob', { id }) + ) + ).then(() => ({ success: true })); + return response.ok({ body: data }); + } catch (err) { + if (isEsError(err)) { + return response.customError({ statusCode: err.statusCode, body: err }); + } + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/rollup/server/routes/api/jobs/register_stop_route.ts b/x-pack/plugins/rollup/server/routes/api/jobs/register_stop_route.ts new file mode 100644 index 0000000000000..118d98e36e03c --- /dev/null +++ b/x-pack/plugins/rollup/server/routes/api/jobs/register_stop_route.ts @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +export const registerStopRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + router.post( + { + path: addBasePath('/stop'), + validate: { + body: schema.object({ + jobIds: schema.arrayOf(schema.string()), + }), + query: schema.object({ + waitForCompletion: schema.maybe(schema.string()), + }), + }, + }, + license.guardApiRoute(async (context, request, response) => { + try { + const { jobIds } = request.body; + // For our API integration tests we need to wait for the jobs to be stopped + // in order to be able to delete them sequentially. + const { waitForCompletion } = request.query; + const stopRollupJob = (id: string) => + context.rollup!.client.callAsCurrentUser('rollup.stopJob', { + id, + waitForCompletion: waitForCompletion === 'true', + }); + const data = await Promise.all(jobIds.map(stopRollupJob)).then(() => ({ success: true })); + return response.ok({ body: data }); + } catch (err) { + if (isEsError(err)) { + return response.customError({ statusCode: err.statusCode, body: err }); + } + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/legacy/plugins/rollup/server/index.ts b/x-pack/plugins/rollup/server/routes/api/search/index.ts similarity index 51% rename from x-pack/legacy/plugins/rollup/server/index.ts rename to x-pack/plugins/rollup/server/routes/api/search/index.ts index 6bbd00ac6576e..2a2d823e79bc6 100644 --- a/x-pack/legacy/plugins/rollup/server/index.ts +++ b/x-pack/plugins/rollup/server/routes/api/search/index.ts @@ -3,7 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { PluginInitializerContext } from 'src/core/server'; -import { RollupsServerPlugin } from './plugin'; -export const plugin = (ctx: PluginInitializerContext) => new RollupsServerPlugin(ctx); +import { RouteDependencies } from '../../../types'; +import { registerSearchRoute } from './register_search_route'; + +export function registerSearchRoutes(dependencies: RouteDependencies) { + registerSearchRoute(dependencies); +} diff --git a/x-pack/plugins/rollup/server/routes/api/search/register_search_route.ts b/x-pack/plugins/rollup/server/routes/api/search/register_search_route.ts new file mode 100644 index 0000000000000..c5c56336def1a --- /dev/null +++ b/x-pack/plugins/rollup/server/routes/api/search/register_search_route.ts @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +export const registerSearchRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + router.post( + { + path: addBasePath('/search'), + validate: { + body: schema.arrayOf( + schema.object({ + index: schema.string(), + query: schema.any(), + }) + ), + }, + }, + license.guardApiRoute(async (context, request, response) => { + try { + const requests = request.body.map(({ index, query }: { index: string; query?: any }) => + context.rollup!.client.callAsCurrentUser('rollup.search', { + index, + rest_total_hits_as_int: true, + body: query, + }) + ); + const data = await Promise.all(requests); + return response.ok({ body: data }); + } catch (err) { + if (isEsError(err)) { + return response.customError({ statusCode: err.statusCode, body: err }); + } + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/rollup/server/routes/index.ts b/x-pack/plugins/rollup/server/routes/index.ts new file mode 100644 index 0000000000000..b25480855b4a2 --- /dev/null +++ b/x-pack/plugins/rollup/server/routes/index.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { RouteDependencies } from '../types'; + +import { registerIndexPatternsRoutes } from './api/index_patterns'; +import { registerIndicesRoutes } from './api/indices'; +import { registerJobsRoutes } from './api/jobs'; +import { registerSearchRoutes } from './api/search'; + +export function registerApiRoutes(dependencies: RouteDependencies) { + registerIndexPatternsRoutes(dependencies); + registerIndicesRoutes(dependencies); + registerJobsRoutes(dependencies); + registerSearchRoutes(dependencies); +} diff --git a/x-pack/legacy/plugins/rollup/server/lib/call_with_request_factory/index.ts b/x-pack/plugins/rollup/server/services/add_base_path.ts similarity index 66% rename from x-pack/legacy/plugins/rollup/server/lib/call_with_request_factory/index.ts rename to x-pack/plugins/rollup/server/services/add_base_path.ts index 787814d87dff9..7d7cce3aab334 100644 --- a/x-pack/legacy/plugins/rollup/server/lib/call_with_request_factory/index.ts +++ b/x-pack/plugins/rollup/server/services/add_base_path.ts @@ -4,4 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -export { callWithRequestFactory } from './call_with_request_factory'; +import { API_BASE_PATH } from '../../common'; + +export const addBasePath = (uri: string): string => `${API_BASE_PATH}${uri}`; diff --git a/x-pack/legacy/plugins/rollup/server/lib/license_pre_routing_factory/index.ts b/x-pack/plugins/rollup/server/services/index.ts similarity index 74% rename from x-pack/legacy/plugins/rollup/server/lib/license_pre_routing_factory/index.ts rename to x-pack/plugins/rollup/server/services/index.ts index 0743e443955f4..7f79c4f446546 100644 --- a/x-pack/legacy/plugins/rollup/server/lib/license_pre_routing_factory/index.ts +++ b/x-pack/plugins/rollup/server/services/index.ts @@ -4,4 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -export { licensePreRoutingFactory } from './license_pre_routing_factory'; +export { addBasePath } from './add_base_path'; +export { License } from './license'; diff --git a/x-pack/plugins/rollup/server/services/license.ts b/x-pack/plugins/rollup/server/services/license.ts new file mode 100644 index 0000000000000..bfd357867c3e2 --- /dev/null +++ b/x-pack/plugins/rollup/server/services/license.ts @@ -0,0 +1,93 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { Logger } from 'src/core/server'; +import { + KibanaRequest, + KibanaResponseFactory, + RequestHandler, + RequestHandlerContext, +} from 'src/core/server'; + +import { LicensingPluginSetup } from '../../../licensing/server'; +import { LicenseType } from '../../../licensing/common/types'; + +export interface LicenseStatus { + isValid: boolean; + message?: string; +} + +interface SetupSettings { + pluginId: string; + minimumLicenseType: LicenseType; + defaultErrorMessage: string; +} + +export class License { + private licenseStatus: LicenseStatus = { + isValid: false, + message: 'Invalid License', + }; + + private _isEsSecurityEnabled: boolean = false; + + setup( + { pluginId, minimumLicenseType, defaultErrorMessage }: SetupSettings, + { licensing, logger }: { licensing: LicensingPluginSetup; logger: Logger } + ) { + licensing.license$.subscribe(license => { + const { state, message } = license.check(pluginId, minimumLicenseType); + const hasRequiredLicense = state === 'valid'; + + // Retrieving security checks the results of GET /_xpack as well as license state, + // so we're also checking whether the security is disabled in elasticsearch.yml. + this._isEsSecurityEnabled = license.getFeature('security').isEnabled; + + if (hasRequiredLicense) { + this.licenseStatus = { isValid: true }; + } else { + this.licenseStatus = { + isValid: false, + message: message || defaultErrorMessage, + }; + if (message) { + logger.info(message); + } + } + }); + } + + guardApiRoute(handler: RequestHandler) { + const license = this; + + return function licenseCheck( + ctx: RequestHandlerContext, + request: KibanaRequest, + response: KibanaResponseFactory + ) { + const licenseStatus = license.getStatus(); + + if (!licenseStatus.isValid) { + return response.customError({ + body: { + message: licenseStatus.message || '', + }, + statusCode: 403, + }); + } + + return handler(ctx, request, response); + }; + } + + getStatus() { + return this.licenseStatus; + } + + // eslint-disable-next-line @typescript-eslint/explicit-member-accessibility + get isEsSecurityEnabled() { + return this._isEsSecurityEnabled; + } +} diff --git a/x-pack/legacy/plugins/rollup/server/shared_imports.ts b/x-pack/plugins/rollup/server/shared_imports.ts similarity index 75% rename from x-pack/legacy/plugins/rollup/server/shared_imports.ts rename to x-pack/plugins/rollup/server/shared_imports.ts index 941610b97707f..09842f529abed 100644 --- a/x-pack/legacy/plugins/rollup/server/shared_imports.ts +++ b/x-pack/plugins/rollup/server/shared_imports.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { IndexPatternsFetcher } from '../../../../../src/plugins/data/server'; +export { IndexPatternsFetcher } from '../../../../src/plugins/data/server'; diff --git a/x-pack/plugins/rollup/server/types.ts b/x-pack/plugins/rollup/server/types.ts new file mode 100644 index 0000000000000..c21d76400164e --- /dev/null +++ b/x-pack/plugins/rollup/server/types.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { IRouter, APICaller, KibanaRequest } from 'src/core/server'; +import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; +import { VisTypeTimeseriesSetup } from 'src/plugins/vis_type_timeseries/server'; + +import { IndexManagementPluginSetup } from '../../index_management/server'; +import { LicensingPluginSetup } from '../../licensing/server'; +import { License } from './services'; +import { IndexPatternsFetcher } from './shared_imports'; +import { isEsError } from './lib/is_es_error'; +import { formatEsError } from './lib/format_es_error'; +import { getCapabilitiesForRollupIndices } from './lib/map_capabilities'; +import { mergeCapabilitiesWithFields } from './lib/merge_capabilities_with_fields'; + +export interface Dependencies { + indexManagement?: IndexManagementPluginSetup; + visTypeTimeseries?: VisTypeTimeseriesSetup; + usageCollection?: UsageCollectionSetup; + licensing: LicensingPluginSetup; +} + +export interface RouteDependencies { + router: IRouter; + license: License; + lib: { + isEsError: typeof isEsError; + formatEsError: typeof formatEsError; + getCapabilitiesForRollupIndices: typeof getCapabilitiesForRollupIndices; + mergeCapabilitiesWithFields: typeof mergeCapabilitiesWithFields; + }; + sharedImports: { + IndexPatternsFetcher: typeof IndexPatternsFetcher; + }; +} + +// TODO: When vis_type_timeseries is fully migrated to the NP, it shouldn't require this shim. +export type CallWithRequestFactoryShim = ( + elasticsearchServiceShim: CallWithRequestFactoryShim, + request: KibanaRequest +) => APICaller; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 5b55c7a15f1b3..19d43870f4673 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -12366,7 +12366,6 @@ "xpack.reporting.shareContextMenu.csvReportsButtonLabel": "CSV レポート", "xpack.reporting.shareContextMenu.pdfReportsButtonLabel": "PDF レポート", "xpack.reporting.shareContextMenu.pngReportsButtonLabel": "PNG レポート", - "xpack.rollupJobs.appName": "ロールアップジョブ", "xpack.rollupJobs.appTitle": "ロールアップジョブ", "xpack.rollupJobs.breadcrumbsTitle": "ロールアップジョブ", "xpack.rollupJobs.create.backButton.label": "戻る", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 1758588d01ba8..9875b66e425f8 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -12370,7 +12370,6 @@ "xpack.reporting.shareContextMenu.csvReportsButtonLabel": "CSV 报告", "xpack.reporting.shareContextMenu.pdfReportsButtonLabel": "PDF 报告", "xpack.reporting.shareContextMenu.pngReportsButtonLabel": "PNG 报告", - "xpack.rollupJobs.appName": "汇总/打包作业", "xpack.rollupJobs.appTitle": "汇总/打包作业", "xpack.rollupJobs.breadcrumbsTitle": "汇总/打包作业", "xpack.rollupJobs.create.backButton.label": "上一步", From a00051f91471378fb2e1f882eb88b15c2fbb1e97 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Fri, 24 Apr 2020 14:33:23 -0700 Subject: [PATCH 05/26] Restrict custom registry URL (#64374) --- .../ingest_manager/common/constants/epm.ts | 1 + .../ingest_manager/common/types/index.ts | 2 +- .../ingest_manager/server/constants/index.ts | 1 + x-pack/plugins/ingest_manager/server/index.ts | 2 +- .../plugins/ingest_manager/server/plugin.ts | 15 +++++++++--- .../server/services/epm/registry/index.ts | 14 +++++------ .../services/epm/registry/registry_url.ts | 24 +++++++++++++++++++ .../ingest_manager/server/services/index.ts | 5 +++- 8 files changed, 51 insertions(+), 13 deletions(-) create mode 100644 x-pack/plugins/ingest_manager/server/services/epm/registry/registry_url.ts diff --git a/x-pack/plugins/ingest_manager/common/constants/epm.ts b/x-pack/plugins/ingest_manager/common/constants/epm.ts index eb72c28e7bf39..4d1f04839f944 100644 --- a/x-pack/plugins/ingest_manager/common/constants/epm.ts +++ b/x-pack/plugins/ingest_manager/common/constants/epm.ts @@ -6,3 +6,4 @@ export const PACKAGES_SAVED_OBJECT_TYPE = 'epm-package'; export const INDEX_PATTERN_SAVED_OBJECT_TYPE = 'index-pattern'; +export const DEFAULT_REGISTRY_URL = 'https://epr.elastic.co'; diff --git a/x-pack/plugins/ingest_manager/common/types/index.ts b/x-pack/plugins/ingest_manager/common/types/index.ts index 42f7a9333118e..748bb14d2d35d 100644 --- a/x-pack/plugins/ingest_manager/common/types/index.ts +++ b/x-pack/plugins/ingest_manager/common/types/index.ts @@ -10,7 +10,7 @@ export interface IngestManagerConfigType { enabled: boolean; epm: { enabled: boolean; - registryUrl: string; + registryUrl?: string; }; fleet: { enabled: boolean; diff --git a/x-pack/plugins/ingest_manager/server/constants/index.ts b/x-pack/plugins/ingest_manager/server/constants/index.ts index b2e72fefe5997..9336b3f870e00 100644 --- a/x-pack/plugins/ingest_manager/server/constants/index.ts +++ b/x-pack/plugins/ingest_manager/server/constants/index.ts @@ -33,4 +33,5 @@ export { // Defaults DEFAULT_AGENT_CONFIG, DEFAULT_OUTPUT, + DEFAULT_REGISTRY_URL, } from '../../common'; diff --git a/x-pack/plugins/ingest_manager/server/index.ts b/x-pack/plugins/ingest_manager/server/index.ts index 851a58f5adac2..365f63eef9bda 100644 --- a/x-pack/plugins/ingest_manager/server/index.ts +++ b/x-pack/plugins/ingest_manager/server/index.ts @@ -22,7 +22,7 @@ export const config = { enabled: schema.boolean({ defaultValue: false }), epm: schema.object({ enabled: schema.boolean({ defaultValue: true }), - registryUrl: schema.uri({ defaultValue: 'https://epr-staging.elastic.co' }), + registryUrl: schema.maybe(schema.uri()), }), fleet: schema.object({ enabled: schema.boolean({ defaultValue: true }), diff --git a/x-pack/plugins/ingest_manager/server/plugin.ts b/x-pack/plugins/ingest_manager/server/plugin.ts index 55aea4b1a4cdd..f843b4411fe4b 100644 --- a/x-pack/plugins/ingest_manager/server/plugin.ts +++ b/x-pack/plugins/ingest_manager/server/plugin.ts @@ -12,7 +12,7 @@ import { PluginInitializerContext, SavedObjectsServiceStart, } from 'kibana/server'; -import { LicensingPluginSetup } from '../../licensing/server'; +import { LicensingPluginSetup, ILicense } from '../../licensing/server'; import { EncryptedSavedObjectsPluginStart, EncryptedSavedObjectsPluginSetup, @@ -42,8 +42,13 @@ import { } from './routes'; import { IngestManagerConfigType } from '../common'; -import { appContextService, ESIndexPatternSavedObjectService } from './services'; -import { ESIndexPatternService, AgentService } from './services'; +import { + appContextService, + licenseService, + ESIndexPatternSavedObjectService, + ESIndexPatternService, + AgentService, +} from './services'; import { getAgentStatusById } from './services/agents'; export interface IngestManagerSetupDeps { @@ -90,6 +95,7 @@ export class IngestManagerPlugin IngestManagerSetupDeps, IngestManagerStartDeps > { + private licensing$!: Observable; private config$: Observable; private security: SecurityPluginSetup | undefined; @@ -98,6 +104,7 @@ export class IngestManagerPlugin } public async setup(core: CoreSetup, deps: IngestManagerSetupDeps) { + this.licensing$ = deps.licensing.license$; if (deps.security) { this.security = deps.security; } @@ -173,6 +180,7 @@ export class IngestManagerPlugin config$: this.config$, savedObjects: core.savedObjects, }); + licenseService.start(this.licensing$); return { esIndexPatternService: new ESIndexPatternSavedObjectService(), agentService: { @@ -183,5 +191,6 @@ export class IngestManagerPlugin public async stop() { appContextService.stop(); + licenseService.stop(); } } diff --git a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts index a96afc5eb7fa5..8e9b920875617 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts @@ -16,11 +16,11 @@ import { RegistrySearchResults, RegistrySearchResult, } from '../../../types'; -import { appContextService } from '../../'; import { cacheGet, cacheSet } from './cache'; import { ArchiveEntry, untarBuffer } from './extract'; import { fetchUrl, getResponse, getResponseStream } from './requests'; import { streamToBuffer } from './streams'; +import { getRegistryUrl } from './registry_url'; export { ArchiveEntry } from './extract'; @@ -32,7 +32,7 @@ export const pkgToPkgKey = ({ name, version }: { name: string; version: string } `${name}-${version}`; export async function fetchList(params?: SearchParams): Promise { - const registryUrl = appContextService.getConfig()?.epm.registryUrl; + const registryUrl = getRegistryUrl(); const url = new URL(`${registryUrl}/search`); if (params && params.category) { url.searchParams.set('category', params.category); @@ -45,7 +45,7 @@ export async function fetchFindLatestPackage( packageName: string, internal: boolean = true ): Promise { - const registryUrl = appContextService.getConfig()?.epm.registryUrl; + const registryUrl = getRegistryUrl(); const url = new URL(`${registryUrl}/search?package=${packageName}&internal=${internal}`); const res = await fetchUrl(url.toString()); const searchResults = JSON.parse(res); @@ -57,17 +57,17 @@ export async function fetchFindLatestPackage( } export async function fetchInfo(pkgName: string, pkgVersion: string): Promise { - const registryUrl = appContextService.getConfig()?.epm.registryUrl; + const registryUrl = getRegistryUrl(); return fetchUrl(`${registryUrl}/package/${pkgName}/${pkgVersion}`).then(JSON.parse); } export async function fetchFile(filePath: string): Promise { - const registryUrl = appContextService.getConfig()?.epm.registryUrl; + const registryUrl = getRegistryUrl(); return getResponse(`${registryUrl}${filePath}`); } export async function fetchCategories(): Promise { - const registryUrl = appContextService.getConfig()?.epm.registryUrl; + const registryUrl = getRegistryUrl(); return fetchUrl(`${registryUrl}/categories`).then(JSON.parse); } @@ -151,7 +151,7 @@ async function getOrFetchArchiveBuffer(pkgName: string, pkgVersion: string): Pro async function fetchArchiveBuffer(pkgName: string, pkgVersion: string): Promise { const { download: archivePath } = await fetchInfo(pkgName, pkgVersion); - const registryUrl = appContextService.getConfig()?.epm.registryUrl; + const registryUrl = getRegistryUrl(); return getResponseStream(`${registryUrl}${archivePath}`).then(streamToBuffer); } diff --git a/x-pack/plugins/ingest_manager/server/services/epm/registry/registry_url.ts b/x-pack/plugins/ingest_manager/server/services/epm/registry/registry_url.ts new file mode 100644 index 0000000000000..d92d6faf8472e --- /dev/null +++ b/x-pack/plugins/ingest_manager/server/services/epm/registry/registry_url.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { DEFAULT_REGISTRY_URL } from '../../../constants'; +import { appContextService, licenseService } from '../../'; + +export const getRegistryUrl = (): string => { + const license = licenseService.getLicenseInformation(); + const customUrl = appContextService.getConfig()?.epm.registryUrl; + + if ( + customUrl && + license && + license.isAvailable && + license.hasAtLeast('gold') && + license.isActive + ) { + return customUrl; + } + + return DEFAULT_REGISTRY_URL; +}; diff --git a/x-pack/plugins/ingest_manager/server/services/index.ts b/x-pack/plugins/ingest_manager/server/services/index.ts index 1b0f174cc1a8e..5141c86516f13 100644 --- a/x-pack/plugins/ingest_manager/server/services/index.ts +++ b/x-pack/plugins/ingest_manager/server/services/index.ts @@ -6,7 +6,6 @@ import { SavedObjectsClientContract } from 'kibana/server'; import { AgentStatus } from '../../common/types/models'; -export { appContextService } from './app_context'; export { ESIndexPatternSavedObjectService } from './es_index_pattern'; /** @@ -36,3 +35,7 @@ export interface AgentService { export { datasourceService } from './datasource'; export { agentConfigService } from './agent_config'; export { outputService } from './output'; + +// Plugin services +export { appContextService } from './app_context'; +export { licenseService } from './license'; From 74bf87721f70d0c71738c209613f290020fed100 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Fri, 24 Apr 2020 14:33:38 -0700 Subject: [PATCH 06/26] [Ingest] Make all saved objects namespace agnostic, move to NP plugin (#64360) * Move saved object type registration & mapping to NP plugin; normalize and prefix saved object type names * Replace hardcoded saved object type names with constants * Adjust output type name * Review and import fixes * Update tests, fixtures, and instructions --- x-pack/legacy/plugins/ingest_manager/index.ts | 33 -- x-pack/plugins/ingest_manager/README.md | 89 +++--- .../ingest_manager/common/constants/agent.ts | 6 +- .../common/constants/agent_config.ts | 2 +- .../common/constants/datasource.ts | 2 +- .../common/constants/enrollment_api_key.ts | 2 +- .../ingest_manager/common/constants/epm.ts | 2 +- .../ingest_manager/common/constants/output.ts | 2 +- .../common/services/agent_status.ts | 8 +- .../dev_docs/api/agents_list.md | 2 +- .../ingest_manager/components/search_bar.tsx | 7 +- .../ingest_manager/constants/index.ts | 11 +- .../components/config_delete_provider.tsx | 3 +- .../components/datasource_delete_provider.tsx | 6 +- .../epm/screens/detail/settings_panel.tsx | 7 +- .../components/agent_events_table.tsx | 7 +- .../sections/fleet/agent_list_page/index.tsx | 10 +- .../enrollment_token_list_page/index.tsx | 4 +- x-pack/plugins/ingest_manager/server/index.ts | 10 - .../plugins/ingest_manager/server/plugin.ts | 3 +- .../server/routes/agent_config/handlers.ts | 3 +- .../ingest_manager/server/saved_objects.ts | 296 +++++++++++------- .../server/services/agent_config.ts | 4 +- .../server/services/agents/acks.test.ts | 8 +- .../server/services/agents/crud.ts | 11 +- .../server/services/agents/events.ts | 5 +- .../server/services/agents/status.ts | 10 +- .../server/services/agents/update.ts | 4 +- .../services/api_keys/enrollment_api_key.ts | 7 +- .../ingest_manager/server/services/output.ts | 4 +- .../api_integration/apis/fleet/agents/acks.ts | 6 +- .../apis/fleet/agents/actions.ts | 2 +- .../apis/fleet/agents/checkin.ts | 6 +- .../apis/fleet/agents/enroll.ts | 6 +- .../apis/fleet/unenroll_agent.ts | 10 +- .../es_archives/fleet/agents/data.json | 66 ++-- .../es_archives/fleet/agents/mappings.json | 24 +- 37 files changed, 382 insertions(+), 306 deletions(-) diff --git a/x-pack/legacy/plugins/ingest_manager/index.ts b/x-pack/legacy/plugins/ingest_manager/index.ts index 47c6478f66471..df9923d9f11ec 100644 --- a/x-pack/legacy/plugins/ingest_manager/index.ts +++ b/x-pack/legacy/plugins/ingest_manager/index.ts @@ -4,43 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ import { resolve } from 'path'; -import { - savedObjectMappings, - OUTPUT_SAVED_OBJECT_TYPE, - AGENT_CONFIG_SAVED_OBJECT_TYPE, - DATASOURCE_SAVED_OBJECT_TYPE, - PACKAGES_SAVED_OBJECT_TYPE, -} from '../../../plugins/ingest_manager/server'; - -// TODO https://github.com/elastic/kibana/issues/46373 -// const INDEX_NAMES = { -// INGEST: '.kibana', -// }; export function ingestManager(kibana: any) { return new kibana.Plugin({ id: 'ingestManager', publicDir: resolve(__dirname, '../../../plugins/ingest_manager/public'), - uiExports: { - savedObjectSchemas: { - [AGENT_CONFIG_SAVED_OBJECT_TYPE]: { - isNamespaceAgnostic: true, - // indexPattern: INDEX_NAMES.INGEST, - }, - [OUTPUT_SAVED_OBJECT_TYPE]: { - isNamespaceAgnostic: true, - // indexPattern: INDEX_NAMES.INGEST, - }, - [DATASOURCE_SAVED_OBJECT_TYPE]: { - isNamespaceAgnostic: true, - // indexPattern: INDEX_NAMES.INGEST, - }, - [PACKAGES_SAVED_OBJECT_TYPE]: { - isNamespaceAgnostic: true, - // indexPattern: INDEX_NAMES.INGEST, - }, - }, - mappings: savedObjectMappings, - }, }); } diff --git a/x-pack/plugins/ingest_manager/README.md b/x-pack/plugins/ingest_manager/README.md index 9cd4821c2a727..0e7abcc3d74a9 100644 --- a/x-pack/plugins/ingest_manager/README.md +++ b/x-pack/plugins/ingest_manager/README.md @@ -1,60 +1,70 @@ # Ingest Manager + ## Plugin - - The plugin is disabled by default. See the TypeScript type for the [the available plugin configuration options](https://github.com/elastic/kibana/blob/master/x-pack/plugins/ingest_manager/common/types/index.ts#L9-L27) - - Setting `xpack.ingestManager.enabled=true` enables the plugin including the EPM and Fleet features. It also adds the `DATASOURCE_API_ROUTES` and `AGENT_CONFIG_API_ROUTES` values in [`common/constants/routes.ts`](./common/constants/routes.ts) - - Adding `--xpack.ingestManager.epm.enabled=false` will disable the EPM API & UI - - Adding `--xpack.ingestManager.fleet.enabled=false` will disable the Fleet API & UI - - [code for adding the routes](https://github.com/elastic/kibana/blob/1f27d349533b1c2865c10c45b2cf705d7416fb36/x-pack/plugins/ingest_manager/server/plugin.ts#L115-L133) - - [Integration tests](server/integration_tests/router.test.ts) - - Both EPM and Fleet require `ingestManager` be enabled. They are not standalone features. + +- The plugin is disabled by default. See the TypeScript type for the [the available plugin configuration options](https://github.com/elastic/kibana/blob/master/x-pack/plugins/ingest_manager/common/types/index.ts#L9-L27) +- Setting `xpack.ingestManager.enabled=true` enables the plugin including the EPM and Fleet features. It also adds the `DATASOURCE_API_ROUTES` and `AGENT_CONFIG_API_ROUTES` values in [`common/constants/routes.ts`](./common/constants/routes.ts) +- Adding `--xpack.ingestManager.epm.enabled=false` will disable the EPM API & UI +- Adding `--xpack.ingestManager.fleet.enabled=false` will disable the Fleet API & UI + - [code for adding the routes](https://github.com/elastic/kibana/blob/1f27d349533b1c2865c10c45b2cf705d7416fb36/x-pack/plugins/ingest_manager/server/plugin.ts#L115-L133) + - [Integration tests](server/integration_tests/router.test.ts) +- Both EPM and Fleet require `ingestManager` be enabled. They are not standalone features. ## Development ### Getting started -See the Kibana docs for [how to set up your dev environment](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#setting-up-your-development-environment), [run Elasticsearch](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#running-elasticsearch), and [start Kibana](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#running-kibana) +See the Kibana docs for [how to set up your dev environment](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#setting-up-your-development-environment), [run Elasticsearch](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#running-elasticsearch), and [start Kibana](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#running-kibana) One common development workflow is: - - Bootstrap Kibana - ``` - yarn kbn bootstrap - ``` - - Start Elasticsearch in one shell - ``` - yarn es snapshot -E xpack.security.authc.api_key.enabled=true - ``` - - Start Kibana in another shell - ``` - yarn start --xpack.ingestManager.enabled=true --no-base-path --xpack.endpoint.enabled=true - ``` + +- Bootstrap Kibana + ``` + yarn kbn bootstrap + ``` +- Start Elasticsearch in one shell + ``` + yarn es snapshot -E xpack.security.authc.api_key.enabled=true + ``` +- Start Kibana in another shell + ``` + yarn start --xpack.ingestManager.enabled=true --no-base-path --xpack.endpoint.enabled=true + ``` This plugin follows the `common`, `server`, `public` structure from the [Architecture Style Guide ](https://github.com/elastic/kibana/blob/master/style_guides/architecture_style_guide.md#file-and-folder-structure). We also follow the pattern of developing feature branches under your personal fork of Kibana. ### API Tests + #### Ingest & Fleet - 1. In one terminal, change to the `x-pack` directory and start the test server with - ``` - node scripts/functional_tests_server.js --config test/api_integration/config.ts - ``` - - 1. in a second terminal, run the tests from the Kibana root directory with - ``` - node scripts/functional_test_runner.js --config x-pack/test/api_integration/config.ts - ``` + +1. In one terminal, change to the `x-pack` directory and start the test server with + + ``` + node scripts/functional_tests_server.js --config test/api_integration/config.js + ``` + +1. in a second terminal, run the tests from the Kibana root directory with + ``` + node scripts/functional_test_runner.js --config x-pack/test/api_integration/config.js + ``` + #### EPM - 1. In one terminal, change to the `x-pack` directory and start the test server with - ``` - node scripts/functional_tests_server.js --config test/epm_api_integration/config.ts - ``` - 1. in a second terminal, run the tests from the Kibana root directory with - ``` - node scripts/functional_test_runner.js --config x-pack/test/epm_api_integration/config.ts - ``` +1. In one terminal, change to the `x-pack` directory and start the test server with + + ``` + node scripts/functional_tests_server.js --config test/epm_api_integration/config.ts + ``` - ### Staying up-to-date with `master` - While we're developing in the `feature-ingest` feature branch, here's is more information on keeping up to date with upstream kibana. +1. in a second terminal, run the tests from the Kibana root directory with + ``` + node scripts/functional_test_runner.js --config x-pack/test/epm_api_integration/config.ts + ``` + +### Staying up-to-date with `master` + +While we're developing in the `feature-ingest` feature branch, here's is more information on keeping up to date with upstream kibana.
merge upstream master into feature-ingest @@ -80,6 +90,7 @@ git push origin ## push your changes to upstream feature branch from the terminal; not GitHub UI git push upstream ``` +
See https://github.com/elastic/kibana/pull/37950 for an example. diff --git a/x-pack/plugins/ingest_manager/common/constants/agent.ts b/x-pack/plugins/ingest_manager/common/constants/agent.ts index 0b462fb4c0319..f3990ba78c539 100644 --- a/x-pack/plugins/ingest_manager/common/constants/agent.ts +++ b/x-pack/plugins/ingest_manager/common/constants/agent.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -export const AGENT_SAVED_OBJECT_TYPE = 'agents'; -export const AGENT_EVENT_SAVED_OBJECT_TYPE = 'agent_events'; -export const AGENT_ACTION_SAVED_OBJECT_TYPE = 'agent_actions'; +export const AGENT_SAVED_OBJECT_TYPE = 'fleet-agents'; +export const AGENT_EVENT_SAVED_OBJECT_TYPE = 'fleet-agent-events'; +export const AGENT_ACTION_SAVED_OBJECT_TYPE = 'fleet-agent-actions'; export const AGENT_TYPE_PERMANENT = 'PERMANENT'; export const AGENT_TYPE_EPHEMERAL = 'EPHEMERAL'; diff --git a/x-pack/plugins/ingest_manager/common/constants/agent_config.ts b/x-pack/plugins/ingest_manager/common/constants/agent_config.ts index 337022e552278..c5067480fb953 100644 --- a/x-pack/plugins/ingest_manager/common/constants/agent_config.ts +++ b/x-pack/plugins/ingest_manager/common/constants/agent_config.ts @@ -5,7 +5,7 @@ */ import { AgentConfigStatus, DefaultPackages } from '../types'; -export const AGENT_CONFIG_SAVED_OBJECT_TYPE = 'agent_configs'; +export const AGENT_CONFIG_SAVED_OBJECT_TYPE = 'ingest-agent-configs'; export const DEFAULT_AGENT_CONFIG = { name: 'Default config', diff --git a/x-pack/plugins/ingest_manager/common/constants/datasource.ts b/x-pack/plugins/ingest_manager/common/constants/datasource.ts index 0ff472b2afeb0..08113cff53bda 100644 --- a/x-pack/plugins/ingest_manager/common/constants/datasource.ts +++ b/x-pack/plugins/ingest_manager/common/constants/datasource.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export const DATASOURCE_SAVED_OBJECT_TYPE = 'datasources'; +export const DATASOURCE_SAVED_OBJECT_TYPE = 'ingest-datasources'; diff --git a/x-pack/plugins/ingest_manager/common/constants/enrollment_api_key.ts b/x-pack/plugins/ingest_manager/common/constants/enrollment_api_key.ts index f4a4bcde2f393..fd28b6632b15c 100644 --- a/x-pack/plugins/ingest_manager/common/constants/enrollment_api_key.ts +++ b/x-pack/plugins/ingest_manager/common/constants/enrollment_api_key.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export const ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE = 'enrollment_api_keys'; +export const ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE = 'fleet-enrollment-api-keys'; diff --git a/x-pack/plugins/ingest_manager/common/constants/epm.ts b/x-pack/plugins/ingest_manager/common/constants/epm.ts index 4d1f04839f944..4fb259609493d 100644 --- a/x-pack/plugins/ingest_manager/common/constants/epm.ts +++ b/x-pack/plugins/ingest_manager/common/constants/epm.ts @@ -4,6 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -export const PACKAGES_SAVED_OBJECT_TYPE = 'epm-package'; +export const PACKAGES_SAVED_OBJECT_TYPE = 'epm-packages'; export const INDEX_PATTERN_SAVED_OBJECT_TYPE = 'index-pattern'; export const DEFAULT_REGISTRY_URL = 'https://epr.elastic.co'; diff --git a/x-pack/plugins/ingest_manager/common/constants/output.ts b/x-pack/plugins/ingest_manager/common/constants/output.ts index 4c22d0e3fe7a3..ac2d6117be921 100644 --- a/x-pack/plugins/ingest_manager/common/constants/output.ts +++ b/x-pack/plugins/ingest_manager/common/constants/output.ts @@ -5,7 +5,7 @@ */ import { OutputType } from '../types'; -export const OUTPUT_SAVED_OBJECT_TYPE = 'outputs'; +export const OUTPUT_SAVED_OBJECT_TYPE = 'ingest-outputs'; export const DEFAULT_OUTPUT = { name: 'default', diff --git a/x-pack/plugins/ingest_manager/common/services/agent_status.ts b/x-pack/plugins/ingest_manager/common/services/agent_status.ts index 7bbac55f11937..36e6e84b35bfe 100644 --- a/x-pack/plugins/ingest_manager/common/services/agent_status.ts +++ b/x-pack/plugins/ingest_manager/common/services/agent_status.ts @@ -8,20 +8,22 @@ import { AGENT_TYPE_TEMPORARY, AGENT_POLLING_THRESHOLD_MS, AGENT_TYPE_PERMANENT, + AGENT_SAVED_OBJECT_TYPE, } from '../constants'; export function buildKueryForOnlineAgents() { - return `agents.last_checkin >= now-${(3 * AGENT_POLLING_THRESHOLD_MS) / 1000}s`; + return `${AGENT_SAVED_OBJECT_TYPE}.last_checkin >= now-${(3 * AGENT_POLLING_THRESHOLD_MS) / + 1000}s`; } export function buildKueryForOfflineAgents() { - return `agents.type:${AGENT_TYPE_TEMPORARY} AND agents.last_checkin < now-${(3 * + return `${AGENT_SAVED_OBJECT_TYPE}.type:${AGENT_TYPE_TEMPORARY} AND ${AGENT_SAVED_OBJECT_TYPE}.last_checkin < now-${(3 * AGENT_POLLING_THRESHOLD_MS) / 1000}s`; } export function buildKueryForErrorAgents() { - return `agents.type:${AGENT_TYPE_PERMANENT} AND agents.last_checkin < now-${(4 * + return `${AGENT_SAVED_OBJECT_TYPE}.type:${AGENT_TYPE_PERMANENT} AND ${AGENT_SAVED_OBJECT_TYPE}.last_checkin < now-${(4 * AGENT_POLLING_THRESHOLD_MS) / 1000}s`; } diff --git a/x-pack/plugins/ingest_manager/dev_docs/api/agents_list.md b/x-pack/plugins/ingest_manager/dev_docs/api/agents_list.md index 38f80a8bdc022..fdb54411f8610 100644 --- a/x-pack/plugins/ingest_manager/dev_docs/api/agents_list.md +++ b/x-pack/plugins/ingest_manager/dev_docs/api/agents_list.md @@ -18,5 +18,5 @@ ## Example ```js -GET /api/ingest_manager/fleet/agents?kuery=agents.last_checkin:2019-10-01T13:42:54.323Z +GET /api/ingest_manager/fleet/agents?kuery=fleet-agents.last_checkin:2019-10-01T13:42:54.323Z ``` diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/search_bar.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/search_bar.tsx index 41c24dadba068..4429b9d8e6b82 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/search_bar.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/search_bar.tsx @@ -8,12 +8,11 @@ import React, { useState, useEffect } from 'react'; import { IFieldType } from 'src/plugins/data/public'; // @ts-ignore import { EuiSuggest, EuiSuggestItemProps } from '@elastic/eui'; -import { useDebounce } from '../hooks'; -import { useStartDeps } from '../hooks/use_deps'; -import { INDEX_NAME } from '../constants'; +import { useDebounce, useStartDeps } from '../hooks'; +import { INDEX_NAME, AGENT_SAVED_OBJECT_TYPE } from '../constants'; const DEBOUNCE_SEARCH_MS = 150; -const HIDDEN_FIELDS = ['agents.actions']; +const HIDDEN_FIELDS = [`${AGENT_SAVED_OBJECT_TYPE}.actions`]; interface Suggestion { label: string; diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/constants/index.ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/constants/index.ts index 619d03651dd96..e9b736e379b58 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/constants/index.ts +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/constants/index.ts @@ -3,7 +3,16 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -export { PLUGIN_ID, EPM_API_ROUTES, AGENT_CONFIG_SAVED_OBJECT_TYPE } from '../../../../common'; +export { + PLUGIN_ID, + EPM_API_ROUTES, + AGENT_API_ROUTES, + AGENT_CONFIG_SAVED_OBJECT_TYPE, + AGENT_EVENT_SAVED_OBJECT_TYPE, + AGENT_SAVED_OBJECT_TYPE, + ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE, + DATASOURCE_SAVED_OBJECT_TYPE, +} from '../../../../common'; export const BASE_PATH = '/app/ingestManager'; export const EPM_PATH = '/epm'; diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/components/config_delete_provider.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/components/config_delete_provider.tsx index b18349e078766..9ae8369abbd52 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/components/config_delete_provider.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/components/config_delete_provider.tsx @@ -8,6 +8,7 @@ import React, { Fragment, useRef, useState } from 'react'; import { EuiConfirmModal, EuiOverlayMask } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; +import { AGENT_SAVED_OBJECT_TYPE } from '../../../constants'; import { sendDeleteAgentConfigs, useCore, sendRequest } from '../../../hooks'; interface Props { @@ -122,7 +123,7 @@ export const AgentConfigDeleteProvider: React.FunctionComponent = ({ chil path: `/api/ingest_manager/fleet/agents`, method: 'get', query: { - kuery: `agents.config_id : (${agentConfigsToCheck.join(' or ')})`, + kuery: `${AGENT_SAVED_OBJECT_TYPE}.config_id : (${agentConfigsToCheck.join(' or ')})`, }, }); setAgentsCount(data?.total || 0); diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/components/datasource_delete_provider.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/components/datasource_delete_provider.tsx index 089b0631c2090..df679d33e0324 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/components/datasource_delete_provider.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/components/datasource_delete_provider.tsx @@ -9,8 +9,8 @@ import { EuiCallOut, EuiConfirmModal, EuiOverlayMask, EuiSpacer } from '@elastic import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { useCore, sendRequest, sendDeleteDatasource, useConfig } from '../../../hooks'; -import { AGENT_API_ROUTES } from '../../../../../../common/constants'; -import { AgentConfig } from '../../../../../../common/types/models'; +import { AGENT_API_ROUTES, AGENT_SAVED_OBJECT_TYPE } from '../../../constants'; +import { AgentConfig } from '../../../types'; interface Props { agentConfig: AgentConfig; @@ -51,7 +51,7 @@ export const DatasourceDeleteProvider: React.FunctionComponent = ({ query: { page: 1, perPage: 1, - kuery: `agents.config_id : ${agentConfig.id}`, + kuery: `${AGENT_SAVED_OBJECT_TYPE}.config_id : ${agentConfig.id}`, }, }); setAgentsCount(data?.total || 0); diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/settings_panel.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/settings_panel.tsx index f947466caf4b0..3589a1a9444e1 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/settings_panel.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/settings_panel.tsx @@ -8,10 +8,11 @@ import React from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiTitle, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; import { EuiSpacer } from '@elastic/eui'; -import { useGetPackageInstallStatus } from '../../hooks'; import { InstallStatus, PackageInfo } from '../../../../types'; -import { InstallationButton } from './installation_button'; import { useGetDatasources } from '../../../../hooks'; +import { DATASOURCE_SAVED_OBJECT_TYPE } from '../../../../constants'; +import { useGetPackageInstallStatus } from '../../hooks'; +import { InstallationButton } from './installation_button'; const NoteLabel = () => ( = ({ ag - + diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx index c79255104a030..23fe18b82468c 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx @@ -40,7 +40,11 @@ import { SearchBar } from '../../../components/search_bar'; import { AgentHealth } from '../components/agent_health'; import { AgentUnenrollProvider } from '../components/agent_unenroll_provider'; import { AgentStatusKueryHelper } from '../../../services'; -import { FLEET_AGENT_DETAIL_PATH, AGENT_CONFIG_DETAILS_PATH } from '../../../constants'; +import { + FLEET_AGENT_DETAIL_PATH, + AGENT_CONFIG_DETAILS_PATH, + AGENT_SAVED_OBJECT_TYPE, +} from '../../../constants'; const NO_WRAP_TRUNCATE_STYLE: CSSProperties = Object.freeze({ overflow: 'hidden', @@ -180,7 +184,7 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { if (kuery) { kuery = `(${kuery}) and`; } - kuery = `${kuery} agents.config_id : (${selectedConfigs + kuery = `${kuery} ${AGENT_SAVED_OBJECT_TYPE}.config_id : (${selectedConfigs .map(config => `"${config}"`) .join(' or ')})`; } @@ -394,7 +398,7 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { }); setSearch(newSearch); }} - fieldPrefix="agents" + fieldPrefix={AGENT_SAVED_OBJECT_TYPE} /> diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/enrollment_token_list_page/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/enrollment_token_list_page/index.tsx index 7520f88215efe..c11e3a49c7693 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/enrollment_token_list_page/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/enrollment_token_list_page/index.tsx @@ -18,6 +18,7 @@ import { EuiText, } from '@elastic/eui'; import { FormattedMessage, FormattedDate } from '@kbn/i18n/react'; +import { ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE } from '../../../constants'; import { usePagination, useGetEnrollmentAPIKeys, @@ -29,7 +30,6 @@ import { import { EnrollmentAPIKey } from '../../../types'; import { SearchBar } from '../../../components/search_bar'; import { NewEnrollmentTokenFlyout } from './components/new_enrollment_key_flyout'; -import {} from '@elastic/eui'; import { ConfirmEnrollmentTokenDelete } from './components/confirm_delete_modal'; const NO_WRAP_TRUNCATE_STYLE: CSSProperties = Object.freeze({ @@ -251,7 +251,7 @@ export const EnrollmentTokenListPage: React.FunctionComponent<{}> = () => { }); setSearch(newSearch); }} - fieldPrefix="enrollment_api_keys" + fieldPrefix={ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE} /> diff --git a/x-pack/plugins/ingest_manager/server/index.ts b/x-pack/plugins/ingest_manager/server/index.ts index 365f63eef9bda..951ff2337d8c7 100644 --- a/x-pack/plugins/ingest_manager/server/index.ts +++ b/x-pack/plugins/ingest_manager/server/index.ts @@ -43,13 +43,3 @@ export type IngestManagerConfigType = TypeOf; export const plugin = (initializerContext: PluginInitializerContext) => { return new IngestManagerPlugin(initializerContext); }; - -// Saved object information bootstrapped by legacy `ingest_manager` plugin -// TODO: Remove once saved object mappings can be done from NP -export { savedObjectMappings } from './saved_objects'; -export { - OUTPUT_SAVED_OBJECT_TYPE, - AGENT_CONFIG_SAVED_OBJECT_TYPE, - DATASOURCE_SAVED_OBJECT_TYPE, - PACKAGES_SAVED_OBJECT_TYPE, -} from './constants'; diff --git a/x-pack/plugins/ingest_manager/server/plugin.ts b/x-pack/plugins/ingest_manager/server/plugin.ts index f843b4411fe4b..4bf9785dcd306 100644 --- a/x-pack/plugins/ingest_manager/server/plugin.ts +++ b/x-pack/plugins/ingest_manager/server/plugin.ts @@ -29,7 +29,7 @@ import { AGENT_EVENT_SAVED_OBJECT_TYPE, ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE, } from './constants'; -import { registerEncryptedSavedObjects } from './saved_objects'; +import { registerSavedObjects, registerEncryptedSavedObjects } from './saved_objects'; import { registerEPMRoutes, registerDatasourceRoutes, @@ -109,6 +109,7 @@ export class IngestManagerPlugin this.security = deps.security; } + registerSavedObjects(core.savedObjects); registerEncryptedSavedObjects(deps.encryptedSavedObjects); // Register feature diff --git a/x-pack/plugins/ingest_manager/server/routes/agent_config/handlers.ts b/x-pack/plugins/ingest_manager/server/routes/agent_config/handlers.ts index 67f758c2c1263..42298960cc615 100644 --- a/x-pack/plugins/ingest_manager/server/routes/agent_config/handlers.ts +++ b/x-pack/plugins/ingest_manager/server/routes/agent_config/handlers.ts @@ -8,6 +8,7 @@ import { RequestHandler } from 'src/core/server'; import bluebird from 'bluebird'; import { appContextService, agentConfigService, datasourceService } from '../../services'; import { listAgents } from '../../services/agents'; +import { AGENT_SAVED_OBJECT_TYPE } from '../../constants'; import { GetAgentConfigsRequestSchema, GetOneAgentConfigRequestSchema, @@ -50,7 +51,7 @@ export const getAgentConfigsHandler: RequestHandler< showInactive: true, perPage: 0, page: 1, - kuery: `agents.config_id:${agentConfig.id}`, + kuery: `${AGENT_SAVED_OBJECT_TYPE}.config_id:${agentConfig.id}`, }).then(({ total: agentTotal }) => (agentConfig.agents = agentTotal)), { concurrency: 10 } ); diff --git a/x-pack/plugins/ingest_manager/server/saved_objects.ts b/x-pack/plugins/ingest_manager/server/saved_objects.ts index 37a00228443e1..d827fb776b12c 100644 --- a/x-pack/plugins/ingest_manager/server/saved_objects.ts +++ b/x-pack/plugins/ingest_manager/server/saved_objects.ts @@ -3,6 +3,9 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + +import { SavedObjectsServiceSetup, SavedObjectsType } from 'kibana/server'; +import { EncryptedSavedObjectsPluginSetup } from '../../encrypted_saved_objects/server'; import { OUTPUT_SAVED_OBJECT_TYPE, AGENT_CONFIG_SAVED_OBJECT_TYPE, @@ -13,156 +16,225 @@ import { AGENT_ACTION_SAVED_OBJECT_TYPE, ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE, } from './constants'; -import { EncryptedSavedObjectsPluginSetup } from '../../encrypted_saved_objects/server'; /* - * Saved object mappings + * Saved object types and mappings * * Please update typings in `/common/types` if mappings are updated. */ -export const savedObjectMappings = { +const savedObjectTypes: { [key: string]: SavedObjectsType } = { [AGENT_SAVED_OBJECT_TYPE]: { - properties: { - shared_id: { type: 'keyword' }, - type: { type: 'keyword' }, - active: { type: 'boolean' }, - enrolled_at: { type: 'date' }, - access_api_key_id: { type: 'keyword' }, - version: { type: 'keyword' }, - user_provided_metadata: { type: 'text' }, - local_metadata: { type: 'text' }, - config_id: { type: 'keyword' }, - last_updated: { type: 'date' }, - last_checkin: { type: 'date' }, - config_revision: { type: 'integer' }, - config_newest_revision: { type: 'integer' }, - default_api_key_id: { type: 'keyword' }, - default_api_key: { type: 'keyword' }, - updated_at: { type: 'date' }, - current_error_events: { type: 'text' }, + name: AGENT_SAVED_OBJECT_TYPE, + hidden: false, + namespaceType: 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + shared_id: { type: 'keyword' }, + type: { type: 'keyword' }, + active: { type: 'boolean' }, + enrolled_at: { type: 'date' }, + access_api_key_id: { type: 'keyword' }, + version: { type: 'keyword' }, + user_provided_metadata: { type: 'text' }, + local_metadata: { type: 'text' }, + config_id: { type: 'keyword' }, + last_updated: { type: 'date' }, + last_checkin: { type: 'date' }, + config_revision: { type: 'integer' }, + config_newest_revision: { type: 'integer' }, + default_api_key_id: { type: 'keyword' }, + default_api_key: { type: 'keyword' }, + updated_at: { type: 'date' }, + current_error_events: { type: 'text' }, + }, }, }, [AGENT_ACTION_SAVED_OBJECT_TYPE]: { - properties: { - agent_id: { type: 'keyword' }, - type: { type: 'keyword' }, - data: { type: 'binary' }, - sent_at: { type: 'date' }, - created_at: { type: 'date' }, + name: AGENT_ACTION_SAVED_OBJECT_TYPE, + hidden: false, + namespaceType: 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + agent_id: { type: 'keyword' }, + type: { type: 'keyword' }, + data: { type: 'binary' }, + sent_at: { type: 'date' }, + created_at: { type: 'date' }, + }, }, }, [AGENT_EVENT_SAVED_OBJECT_TYPE]: { - properties: { - type: { type: 'keyword' }, - subtype: { type: 'keyword' }, - agent_id: { type: 'keyword' }, - action_id: { type: 'keyword' }, - config_id: { type: 'keyword' }, - stream_id: { type: 'keyword' }, - timestamp: { type: 'date' }, - message: { type: 'text' }, - payload: { type: 'text' }, - data: { type: 'text' }, + name: AGENT_EVENT_SAVED_OBJECT_TYPE, + hidden: false, + namespaceType: 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + type: { type: 'keyword' }, + subtype: { type: 'keyword' }, + agent_id: { type: 'keyword' }, + action_id: { type: 'keyword' }, + config_id: { type: 'keyword' }, + stream_id: { type: 'keyword' }, + timestamp: { type: 'date' }, + message: { type: 'text' }, + payload: { type: 'text' }, + data: { type: 'text' }, + }, }, }, [AGENT_CONFIG_SAVED_OBJECT_TYPE]: { - properties: { - id: { type: 'keyword' }, - name: { type: 'text' }, - is_default: { type: 'boolean' }, - namespace: { type: 'keyword' }, - description: { type: 'text' }, - status: { type: 'keyword' }, - datasources: { type: 'keyword' }, - updated_on: { type: 'keyword' }, - updated_by: { type: 'keyword' }, - revision: { type: 'integer' }, + name: AGENT_CONFIG_SAVED_OBJECT_TYPE, + hidden: false, + namespaceType: 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + id: { type: 'keyword' }, + name: { type: 'text' }, + is_default: { type: 'boolean' }, + namespace: { type: 'keyword' }, + description: { type: 'text' }, + status: { type: 'keyword' }, + datasources: { type: 'keyword' }, + updated_on: { type: 'keyword' }, + updated_by: { type: 'keyword' }, + revision: { type: 'integer' }, + }, }, }, [ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE]: { - properties: { - name: { type: 'keyword' }, - type: { type: 'keyword' }, - api_key: { type: 'binary' }, - api_key_id: { type: 'keyword' }, - config_id: { type: 'keyword' }, - created_at: { type: 'date' }, - updated_at: { type: 'date' }, - expire_at: { type: 'date' }, - active: { type: 'boolean' }, + name: ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE, + hidden: false, + namespaceType: 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + name: { type: 'keyword' }, + type: { type: 'keyword' }, + api_key: { type: 'binary' }, + api_key_id: { type: 'keyword' }, + config_id: { type: 'keyword' }, + created_at: { type: 'date' }, + updated_at: { type: 'date' }, + expire_at: { type: 'date' }, + active: { type: 'boolean' }, + }, }, }, [OUTPUT_SAVED_OBJECT_TYPE]: { - properties: { - name: { type: 'keyword' }, - type: { type: 'keyword' }, - is_default: { type: 'boolean' }, - hosts: { type: 'keyword' }, - ca_sha256: { type: 'keyword' }, - fleet_enroll_username: { type: 'binary' }, - fleet_enroll_password: { type: 'binary' }, - config: { type: 'flattened' }, + name: OUTPUT_SAVED_OBJECT_TYPE, + hidden: false, + namespaceType: 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + name: { type: 'keyword' }, + type: { type: 'keyword' }, + is_default: { type: 'boolean' }, + hosts: { type: 'keyword' }, + ca_sha256: { type: 'keyword' }, + fleet_enroll_username: { type: 'binary' }, + fleet_enroll_password: { type: 'binary' }, + config: { type: 'flattened' }, + }, }, }, [DATASOURCE_SAVED_OBJECT_TYPE]: { - properties: { - name: { type: 'keyword' }, - description: { type: 'text' }, - namespace: { type: 'keyword' }, - config_id: { type: 'keyword' }, - enabled: { type: 'boolean' }, - package: { - properties: { - name: { type: 'keyword' }, - title: { type: 'keyword' }, - version: { type: 'keyword' }, + name: DATASOURCE_SAVED_OBJECT_TYPE, + hidden: false, + namespaceType: 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + name: { type: 'keyword' }, + description: { type: 'text' }, + namespace: { type: 'keyword' }, + config_id: { type: 'keyword' }, + enabled: { type: 'boolean' }, + package: { + properties: { + name: { type: 'keyword' }, + title: { type: 'keyword' }, + version: { type: 'keyword' }, + }, }, - }, - output_id: { type: 'keyword' }, - inputs: { - type: 'nested', - properties: { - type: { type: 'keyword' }, - enabled: { type: 'boolean' }, - processors: { type: 'keyword' }, - config: { type: 'flattened' }, - streams: { - type: 'nested', - properties: { - id: { type: 'keyword' }, - enabled: { type: 'boolean' }, - dataset: { type: 'keyword' }, - processors: { type: 'keyword' }, - config: { type: 'flattened' }, - pkg_stream: { type: 'flattened' }, + output_id: { type: 'keyword' }, + inputs: { + type: 'nested', + properties: { + type: { type: 'keyword' }, + enabled: { type: 'boolean' }, + processors: { type: 'keyword' }, + config: { type: 'flattened' }, + streams: { + type: 'nested', + properties: { + id: { type: 'keyword' }, + enabled: { type: 'boolean' }, + dataset: { type: 'keyword' }, + processors: { type: 'keyword' }, + config: { type: 'flattened' }, + pkg_stream: { type: 'flattened' }, + }, }, }, }, + revision: { type: 'integer' }, }, - revision: { type: 'integer' }, }, }, [PACKAGES_SAVED_OBJECT_TYPE]: { - properties: { - name: { type: 'keyword' }, - version: { type: 'keyword' }, - internal: { type: 'boolean' }, - removable: { type: 'boolean' }, - es_index_patterns: { - dynamic: false, - type: 'object', - }, - installed: { - type: 'nested', - properties: { - id: { type: 'keyword' }, - type: { type: 'keyword' }, + name: PACKAGES_SAVED_OBJECT_TYPE, + hidden: false, + namespaceType: 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + name: { type: 'keyword' }, + version: { type: 'keyword' }, + internal: { type: 'boolean' }, + removable: { type: 'boolean' }, + es_index_patterns: { + dynamic: 'false', + type: 'object', + }, + installed: { + type: 'nested', + properties: { + id: { type: 'keyword' }, + type: { type: 'keyword' }, + }, }, }, }, }, }; +export function registerSavedObjects(savedObjects: SavedObjectsServiceSetup) { + Object.values(savedObjectTypes).forEach(type => { + savedObjects.registerType(type); + }); +} + export function registerEncryptedSavedObjects( encryptedSavedObjects: EncryptedSavedObjectsPluginSetup ) { diff --git a/x-pack/plugins/ingest_manager/server/services/agent_config.ts b/x-pack/plugins/ingest_manager/server/services/agent_config.ts index 309ddca3784c2..75bbfc21293c2 100644 --- a/x-pack/plugins/ingest_manager/server/services/agent_config.ts +++ b/x-pack/plugins/ingest_manager/server/services/agent_config.ts @@ -67,7 +67,7 @@ class AgentConfigService { public async ensureDefaultAgentConfig(soClient: SavedObjectsClientContract) { const configs = await soClient.find({ type: AGENT_CONFIG_SAVED_OBJECT_TYPE, - filter: 'agent_configs.attributes.is_default:true', + filter: `${AGENT_CONFIG_SAVED_OBJECT_TYPE}.attributes.is_default:true`, }); if (configs.total === 0) { @@ -244,7 +244,7 @@ class AgentConfigService { public async getDefaultAgentConfigId(soClient: SavedObjectsClientContract) { const configs = await soClient.find({ type: AGENT_CONFIG_SAVED_OBJECT_TYPE, - filter: 'agent_configs.attributes.is_default:true', + filter: `${AGENT_CONFIG_SAVED_OBJECT_TYPE}.attributes.is_default:true`, }); if (configs.saved_objects.length === 0) { diff --git a/x-pack/plugins/ingest_manager/server/services/agents/acks.test.ts b/x-pack/plugins/ingest_manager/server/services/agents/acks.test.ts index a8fada00e25da..ae0dedce178a8 100644 --- a/x-pack/plugins/ingest_manager/server/services/agents/acks.test.ts +++ b/x-pack/plugins/ingest_manager/server/services/agents/acks.test.ts @@ -14,7 +14,7 @@ import { AgentActionSOAttributes, AgentEvent, } from '../../../common/types/models'; -import { AGENT_TYPE_PERMANENT } from '../../../common/constants'; +import { AGENT_TYPE_PERMANENT, AGENT_ACTION_SAVED_OBJECT_TYPE } from '../../../common/constants'; import { acknowledgeAgentActions } from './acks'; import { appContextService } from '../app_context'; import { IngestManagerAppContext } from '../../plugin'; @@ -31,7 +31,7 @@ describe('test agent acks services', () => { Promise.resolve({ id: 'action1', references: [], - type: 'agent_actions', + type: AGENT_ACTION_SAVED_OBJECT_TYPE, attributes: { type: 'CONFIG_CHANGE', agent_id: 'id', @@ -48,7 +48,7 @@ describe('test agent acks services', () => { { id: 'action1', references: [], - type: 'agent_actions', + type: AGENT_ACTION_SAVED_OBJECT_TYPE, attributes: { type: 'CONFIG_CHANGE', agent_id: 'id', @@ -137,7 +137,7 @@ describe('test agent acks services', () => { { id: 'action1', references: [], - type: 'agent_actions', + type: AGENT_ACTION_SAVED_OBJECT_TYPE, attributes: { type: 'CONFIG_CHANGE', agent_id: 'id', diff --git a/x-pack/plugins/ingest_manager/server/services/agents/crud.ts b/x-pack/plugins/ingest_manager/server/services/agents/crud.ts index ec270884e62b4..175b92b75aca0 100644 --- a/x-pack/plugins/ingest_manager/server/services/agents/crud.ts +++ b/x-pack/plugins/ingest_manager/server/services/agents/crud.ts @@ -31,12 +31,17 @@ export async function listAgents( if (kuery && kuery !== '') { // To ensure users dont need to know about SO data structure... - filters.push(kuery.replace(/agents\./g, 'agents.attributes.')); + filters.push( + kuery.replace( + new RegExp(`${AGENT_SAVED_OBJECT_TYPE}\.`, 'g'), + `${AGENT_SAVED_OBJECT_TYPE}.attributes.` + ) + ); } if (showInactive === false) { - const agentActiveCondition = `agents.attributes.active:true AND not agents.attributes.type:${AGENT_TYPE_EPHEMERAL}`; - const recentlySeenEphemeralAgent = `agents.attributes.active:true AND agents.attributes.type:${AGENT_TYPE_EPHEMERAL} AND agents.attributes.last_checkin > ${Date.now() - + const agentActiveCondition = `${AGENT_SAVED_OBJECT_TYPE}.attributes.active:true AND not ${AGENT_SAVED_OBJECT_TYPE}.attributes.type:${AGENT_TYPE_EPHEMERAL}`; + const recentlySeenEphemeralAgent = `${AGENT_SAVED_OBJECT_TYPE}.attributes.active:true AND ${AGENT_SAVED_OBJECT_TYPE}.attributes.type:${AGENT_TYPE_EPHEMERAL} AND ${AGENT_SAVED_OBJECT_TYPE}.attributes.last_checkin > ${Date.now() - 3 * AGENT_POLLING_THRESHOLD_MS}`; filters.push(`(${agentActiveCondition}) OR (${recentlySeenEphemeralAgent})`); } diff --git a/x-pack/plugins/ingest_manager/server/services/agents/events.ts b/x-pack/plugins/ingest_manager/server/services/agents/events.ts index 707229845531c..2758374eba65f 100644 --- a/x-pack/plugins/ingest_manager/server/services/agents/events.ts +++ b/x-pack/plugins/ingest_manager/server/services/agents/events.ts @@ -23,7 +23,10 @@ export async function getAgentEvents( type: AGENT_EVENT_SAVED_OBJECT_TYPE, filter: kuery && kuery !== '' - ? kuery.replace(/agent_events\./g, 'agent_events.attributes.') + ? kuery.replace( + new RegExp(`${AGENT_EVENT_SAVED_OBJECT_TYPE}\.`, 'g'), + `${AGENT_EVENT_SAVED_OBJECT_TYPE}.attributes.` + ) : undefined, perPage, page, diff --git a/x-pack/plugins/ingest_manager/server/services/agents/status.ts b/x-pack/plugins/ingest_manager/server/services/agents/status.ts index fce989cea3248..c4d4a8436e147 100644 --- a/x-pack/plugins/ingest_manager/server/services/agents/status.ts +++ b/x-pack/plugins/ingest_manager/server/services/agents/status.ts @@ -6,7 +6,7 @@ import { SavedObjectsClientContract } from 'src/core/server'; import { getAgent, listAgents } from './crud'; -import { AGENT_EVENT_SAVED_OBJECT_TYPE } from '../../constants'; +import { AGENT_EVENT_SAVED_OBJECT_TYPE, AGENT_SAVED_OBJECT_TYPE } from '../../constants'; import { AgentStatus, Agent } from '../../types'; import { @@ -72,8 +72,8 @@ export async function getAgentStatusForConfig( page: 1, kuery: configId ? kuery - ? `(${kuery}) and (agents.config_id:"${configId}")` - : `agents.config_id:"${configId}"` + ? `(${kuery}) and (${AGENT_SAVED_OBJECT_TYPE}.config_id:"${configId}")` + : `${AGENT_SAVED_OBJECT_TYPE}.config_id:"${configId}"` : kuery, }) ) @@ -91,7 +91,9 @@ export async function getAgentStatusForConfig( async function getEventsCount(soClient: SavedObjectsClientContract, configId?: string) { const { total } = await soClient.find({ type: AGENT_EVENT_SAVED_OBJECT_TYPE, - filter: configId ? `agent_events.attributes.config_id:"${configId}"` : undefined, + filter: configId + ? `${AGENT_EVENT_SAVED_OBJECT_TYPE}.attributes.config_id:"${configId}"` + : undefined, perPage: 0, page: 1, sortField: 'timestamp', diff --git a/x-pack/plugins/ingest_manager/server/services/agents/update.ts b/x-pack/plugins/ingest_manager/server/services/agents/update.ts index 948e518dff5b4..fd57e83d7421e 100644 --- a/x-pack/plugins/ingest_manager/server/services/agents/update.ts +++ b/x-pack/plugins/ingest_manager/server/services/agents/update.ts @@ -22,7 +22,7 @@ export async function updateAgentsForConfigId( let page = 1; while (hasMore) { const { agents } = await listAgents(soClient, { - kuery: `agents.config_id:"${configId}"`, + kuery: `${AGENT_SAVED_OBJECT_TYPE}.config_id:"${configId}"`, page: page++, perPage: 1000, showInactive: true, @@ -46,7 +46,7 @@ export async function unenrollForConfigId(soClient: SavedObjectsClientContract, let page = 1; while (hasMore) { const { agents } = await listAgents(soClient, { - kuery: `agents.config_id:"${configId}"`, + kuery: `${AGENT_SAVED_OBJECT_TYPE}.config_id:"${configId}"`, page: page++, perPage: 1000, showInactive: true, diff --git a/x-pack/plugins/ingest_manager/server/services/api_keys/enrollment_api_key.ts b/x-pack/plugins/ingest_manager/server/services/api_keys/enrollment_api_key.ts index c9ead09b0908d..1ac812c3380cd 100644 --- a/x-pack/plugins/ingest_manager/server/services/api_keys/enrollment_api_key.ts +++ b/x-pack/plugins/ingest_manager/server/services/api_keys/enrollment_api_key.ts @@ -31,7 +31,10 @@ export async function listEnrollmentApiKeys( sortOrder: 'DESC', filter: kuery && kuery !== '' - ? kuery.replace(/enrollment_api_keys\./g, 'enrollment_api_keys.attributes.') + ? kuery.replace( + new RegExp(`${ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE}\.`, 'g'), + `${ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE}.attributes.` + ) : undefined, }); @@ -80,7 +83,7 @@ export async function deleteEnrollmentApiKeyForConfigId( const { items } = await listEnrollmentApiKeys(soClient, { page: page++, perPage: 100, - kuery: `enrollment_api_keys.config_id:${configId}`, + kuery: `${ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE}.config_id:${configId}`, }); if (items.length === 0) { diff --git a/x-pack/plugins/ingest_manager/server/services/output.ts b/x-pack/plugins/ingest_manager/server/services/output.ts index aebb8188db0cc..6c0dce79d550d 100644 --- a/x-pack/plugins/ingest_manager/server/services/output.ts +++ b/x-pack/plugins/ingest_manager/server/services/output.ts @@ -14,7 +14,7 @@ class OutputService { public async ensureDefaultOutput(soClient: SavedObjectsClientContract) { const outputs = await soClient.find({ type: OUTPUT_SAVED_OBJECT_TYPE, - filter: 'outputs.attributes.is_default:true', + filter: `${OUTPUT_SAVED_OBJECT_TYPE}.attributes.is_default:true`, }); if (!outputs.saved_objects.length) { @@ -44,7 +44,7 @@ class OutputService { public async getDefaultOutputId(soClient: SavedObjectsClientContract) { const outputs = await soClient.find({ type: OUTPUT_SAVED_OBJECT_TYPE, - filter: 'outputs.attributes.is_default:true', + filter: `${OUTPUT_SAVED_OBJECT_TYPE}.attributes.is_default:true`, }); if (!outputs.saved_objects.length) { diff --git a/x-pack/test/api_integration/apis/fleet/agents/acks.ts b/x-pack/test/api_integration/apis/fleet/agents/acks.ts index f08ce33d8b60f..adde6dd184b81 100644 --- a/x-pack/test/api_integration/apis/fleet/agents/acks.ts +++ b/x-pack/test/api_integration/apis/fleet/agents/acks.ts @@ -32,12 +32,12 @@ export default function(providerContext: FtrProviderContext) { body: { _source: agentDoc }, } = await esClient.get({ index: '.kibana', - id: 'agents:agent1', + id: 'fleet-agents:agent1', }); - agentDoc.agents.access_api_key_id = apiKey.id; + agentDoc['fleet-agents'].access_api_key_id = apiKey.id; await esClient.update({ index: '.kibana', - id: 'agents:agent1', + id: 'fleet-agents:agent1', refresh: 'true', body: { doc: agentDoc, diff --git a/x-pack/test/api_integration/apis/fleet/agents/actions.ts b/x-pack/test/api_integration/apis/fleet/agents/actions.ts index cf0641acf9e1c..577299e652610 100644 --- a/x-pack/test/api_integration/apis/fleet/agents/actions.ts +++ b/x-pack/test/api_integration/apis/fleet/agents/actions.ts @@ -67,7 +67,7 @@ export default function(providerContext: FtrProviderContext) { }, }) .expect(404); - expect(apiResponse.message).to.eql('Saved object [agents/agent100] not found'); + expect(apiResponse.message).to.eql('Saved object [fleet-agents/agent100] not found'); }); }); } diff --git a/x-pack/test/api_integration/apis/fleet/agents/checkin.ts b/x-pack/test/api_integration/apis/fleet/agents/checkin.ts index ca51676126e73..b405b5065bc0e 100644 --- a/x-pack/test/api_integration/apis/fleet/agents/checkin.ts +++ b/x-pack/test/api_integration/apis/fleet/agents/checkin.ts @@ -32,12 +32,12 @@ export default function(providerContext: FtrProviderContext) { body: { _source: agentDoc }, } = await esClient.get({ index: '.kibana', - id: 'agents:agent1', + id: 'fleet-agents:agent1', }); - agentDoc.agents.access_api_key_id = apiKey.id; + agentDoc['fleet-agents'].access_api_key_id = apiKey.id; await esClient.update({ index: '.kibana', - id: 'agents:agent1', + id: 'fleet-agents:agent1', refresh: 'true', body: { doc: agentDoc, diff --git a/x-pack/test/api_integration/apis/fleet/agents/enroll.ts b/x-pack/test/api_integration/apis/fleet/agents/enroll.ts index d8e9749744ea4..c934ddf8a406b 100644 --- a/x-pack/test/api_integration/apis/fleet/agents/enroll.ts +++ b/x-pack/test/api_integration/apis/fleet/agents/enroll.ts @@ -33,13 +33,13 @@ export default function(providerContext: FtrProviderContext) { body: { _source: enrollmentApiKeyDoc }, } = await esClient.get({ index: '.kibana', - id: 'enrollment_api_keys:ed22ca17-e178-4cfe-8b02-54ea29fbd6d0', + id: 'fleet-enrollment-api-keys:ed22ca17-e178-4cfe-8b02-54ea29fbd6d0', }); // @ts-ignore - enrollmentApiKeyDoc.enrollment_api_keys.api_key_id = apiKey.id; + enrollmentApiKeyDoc['fleet-enrollment-api-keys'].api_key_id = apiKey.id; await esClient.update({ index: '.kibana', - id: 'enrollment_api_keys:ed22ca17-e178-4cfe-8b02-54ea29fbd6d0', + id: 'fleet-enrollment-api-keys:ed22ca17-e178-4cfe-8b02-54ea29fbd6d0', refresh: 'true', body: { doc: enrollmentApiKeyDoc, diff --git a/x-pack/test/api_integration/apis/fleet/unenroll_agent.ts b/x-pack/test/api_integration/apis/fleet/unenroll_agent.ts index d33b92acf95a5..5b8e03269ceef 100644 --- a/x-pack/test/api_integration/apis/fleet/unenroll_agent.ts +++ b/x-pack/test/api_integration/apis/fleet/unenroll_agent.ts @@ -40,18 +40,18 @@ export default function(providerContext: FtrProviderContext) { body: { _source: agentDoc }, } = await esClient.get({ index: '.kibana', - id: 'agents:agent1', + id: 'fleet-agents:agent1', }); // @ts-ignore - agentDoc.agents.access_api_key_id = accessAPIKeyId; - agentDoc.agents.default_api_key_id = outputAPIKeyBody.id; - agentDoc.agents.default_api_key = Buffer.from( + agentDoc['fleet-agents'].access_api_key_id = accessAPIKeyId; + agentDoc['fleet-agents'].default_api_key_id = outputAPIKeyBody.id; + agentDoc['fleet-agents'].default_api_key = Buffer.from( `${outputAPIKeyBody.id}:${outputAPIKeyBody.api_key}` ).toString('base64'); await esClient.update({ index: '.kibana', - id: 'agents:agent1', + id: 'fleet-agents:agent1', refresh: 'true', body: { doc: agentDoc, diff --git a/x-pack/test/functional/es_archives/fleet/agents/data.json b/x-pack/test/functional/es_archives/fleet/agents/data.json index 1ffb119ca1023..3fe4f828ba128 100644 --- a/x-pack/test/functional/es_archives/fleet/agents/data.json +++ b/x-pack/test/functional/es_archives/fleet/agents/data.json @@ -1,11 +1,11 @@ { "type": "doc", "value": { - "id": "agents:agent1", + "id": "fleet-agents:agent1", "index": ".kibana", "source": { - "type": "agents", - "agents": { + "type": "fleet-agents", + "fleet-agents": { "access_api_key_id": "api-key-2", "active": true, "shared_id": "agent1_filebeat", @@ -21,11 +21,11 @@ { "type": "doc", "value": { - "id": "agents:agent2", + "id": "fleet-agents:agent2", "index": ".kibana", "source": { - "type": "agents", - "agents": { + "type": "fleet-agents", + "fleet-agents": { "access_api_key_id": "api-key-2", "active": true, "shared_id": "agent2_filebeat", @@ -40,11 +40,11 @@ { "type": "doc", "value": { - "id": "agents:agent3", + "id": "fleet-agents:agent3", "index": ".kibana", "source": { - "type": "agents", - "agents": { + "type": "fleet-agents", + "fleet-agents": { "access_api_key_id": "api-key-3", "active": true, "shared_id": "agent3_metricbeat", @@ -59,11 +59,11 @@ { "type": "doc", "value": { - "id": "agents:agent4", + "id": "fleet-agents:agent4", "index": ".kibana", "source": { - "type": "agents", - "agents": { + "type": "fleet-agents", + "fleet-agents": { "access_api_key_id": "api-key-4", "active": true, "shared_id": "agent4_metricbeat", @@ -78,17 +78,17 @@ { "type": "doc", "value": { - "id": "enrollment_api_keys:ed22ca17-e178-4cfe-8b02-54ea29fbd6d0", + "id": "fleet-enrollment-api-keys:ed22ca17-e178-4cfe-8b02-54ea29fbd6d0", "index": ".kibana", "source": { - "enrollment_api_keys" : { + "fleet-enrollment-api-keys" : { "created_at" : "2019-10-10T16:31:12.518Z", "name": "FleetEnrollmentKey:1", "api_key_id" : "key", "config_id" : "policy:1", "active" : true }, - "type" : "enrollment_api_keys", + "type" : "fleet-enrollment-api-keys", "references": [] } } @@ -97,11 +97,11 @@ { "type": "doc", "value": { - "id": "events:event1", + "id": "fleet-agent-events:event1", "index": ".kibana", "source": { - "type": "agent_events", - "agent_events": { + "type": "fleet-agent-events", + "fleet-agent-events": { "agent_id": "agent1", "type": "STATE", "subtype": "STARTED", @@ -116,11 +116,11 @@ { "type": "doc", "value": { - "id": "events:event2", + "id": "fleet-agent-events:event2", "index": ".kibana", "source": { - "type": "agent_events", - "agent_events": { + "type": "fleet-agent-events", + "fleet-agent-events": { "agent_id": "agent1", "type": "STATE", "subtype": "STOPPED", @@ -135,11 +135,11 @@ { "type": "doc", "value": { - "id": "agent_actions:37ed51ff-e80f-4f2a-a62d-f4fa975e7d85", + "id": "fleet-agent-actions:37ed51ff-e80f-4f2a-a62d-f4fa975e7d85", "index": ".kibana", "source": { - "type": "agent_actions", - "agent_actions": { + "type": "fleet-agent-actions", + "fleet-agent-actions": { "agent_id": "agent1", "created_at": "2019-09-04T15:04:07+0000", "type": "RESUME", @@ -152,11 +152,11 @@ { "type": "doc", "value": { - "id": "agent_actions:b400439c-bbbf-43d5-83cb-cf8b7e32506f", + "id": "fleet-agent-actions:b400439c-bbbf-43d5-83cb-cf8b7e32506f", "index": ".kibana", "source": { - "type": "agent_actions", - "agent_actions": { + "type": "fleet-agent-actions", + "fleet-agent-actions": { "agent_id": "agent1", "type": "PAUSE", "created_at": "2019-09-04T15:01:07+0000", @@ -169,11 +169,11 @@ { "type": "doc", "value": { - "id": "agent_actions:48cebde1-c906-4893-b89f-595d943b72a1", + "id": "fleet-agent-actions:48cebde1-c906-4893-b89f-595d943b72a1", "index": ".kibana", "source": { - "type": "agent_actions", - "agent_actions": { + "type": "fleet-agent-actions", + "fleet-agent-actions": { "agent_id": "agent1", "type": "CONFIG_CHANGE", "created_at": "2020-03-15T03:47:15.129Z", @@ -186,11 +186,11 @@ { "type": "doc", "value": { - "id": "agent_actions:48cebde1-c906-4893-b89f-595d943b72a2", + "id": "fleet-agent-actions:48cebde1-c906-4893-b89f-595d943b72a2", "index": ".kibana", "source": { - "type": "agent_actions", - "agent_actions": { + "type": "fleet-agent-actions", + "fleet-agent-actions": { "agent_id": "agent1", "type": "CONFIG_CHANGE", "created_at": "2020-03-15T03:47:15.129Z", diff --git a/x-pack/test/functional/es_archives/fleet/agents/mappings.json b/x-pack/test/functional/es_archives/fleet/agents/mappings.json index 31ae161049303..5d5d373797d4c 100644 --- a/x-pack/test/functional/es_archives/fleet/agents/mappings.json +++ b/x-pack/test/functional/es_archives/fleet/agents/mappings.json @@ -9,7 +9,7 @@ "dynamic": "strict", "_meta": { "migrationMappingPropertyHashes": { - "outputs": "aee9782e0d500b867859650a36280165", + "ingest-outputs": "aee9782e0d500b867859650a36280165", "ml-telemetry": "257fd1d4b4fdbb9cb4b8a3b27da201e9", "visualization": "52d7a13ad68a150c4525b292d23e12cc", "references": "7997cf5a56cc02bdc9c93361bde732b0", @@ -23,14 +23,14 @@ "dashboard": "d00f614b29a80360e1190193fd333bab", "metrics-explorer-view": "53c5365793677328df0ccb6138bf3cdd", "siem-detection-engine-rule-actions": "90eee2e4635260f4be0a1da8f5bc0aa0", - "agent_events": "3231653fafe4ef3196fe3b32ab774bf2", + "fleet-agent-events": "3231653fafe4ef3196fe3b32ab774bf2", "query": "11aaeb7f5f7fa5bb43f25e18ce26e7d9", "file-upload-telemetry": "0ed4d3e1983d1217a30982630897092e", "application_usage_transactional": "965839e75f809fefe04f92dc4d99722a", "action_task_params": "a9d49f184ee89641044be0ca2950fa3a", "apm-indices": "9bb9b2bf1fa636ed8619cbab5ce6a1dd", "inventory-view": "9ecce5b58867403613d82fe496470b34", - "enrollment_api_keys": "28b91e20b105b6f928e2012600085d8f", + "fleet-enrollment-api-keys": "28b91e20b105b6f928e2012600085d8f", "upgrade-assistant-reindex-operation": "a53a20fe086b72c9a86da3cc12dad8a6", "cases-comments": "c2061fb929f585df57425102fa928b4b", "canvas-element": "7390014e1091044523666d97247392fc", @@ -50,20 +50,20 @@ "siem-detection-engine-rule-status": "ae783f41c6937db6b7a2ef5c93a9e9b0", "map": "23d7aa4a720d4938ccde3983f87bd58d", "uptime-dynamic-settings": "b6289473c8985c79b6c47eebc19a0ca5", - "epm-package": "75d12cd13c867fd713d7dfb27366bc20", + "epm-packages": "75d12cd13c867fd713d7dfb27366bc20", "apm-telemetry": "3525d7c22c42bc80f5e6e9cb3f2b26a2", "cases": "08b8b110dbca273d37e8aef131ecab61", "siem-ui-timeline": "ac8020190f5950dd3250b6499144e7fb", "kql-telemetry": "d12a98a6f19a2d273696597547e064ee", "ui-metric": "0d409297dc5ebe1e3a1da691c6ee32e3", "url": "c7f66a0df8b1b52f17c28c4adb111105", - "agents": "c3eeb7b9d97176f15f6d126370ab23c7", + "fleet-agents": "c3eeb7b9d97176f15f6d126370ab23c7", "migrationVersion": "4a1746014a75ade3a714e1db5763276f", "index-pattern": "66eccb05066c5a89924f48a9e9736499", "maps-telemetry": "268da3a48066123fc5baf35abaa55014", "namespace": "2f4316de49999235636386fe51dc06c1", "cases-user-actions": "32277330ec6b721abe3b846cfd939a71", - "agent_actions": "ed270b46812f0fa1439366c428a2cf17", + "fleet-agent-actions": "ed270b46812f0fa1439366c428a2cf17", "siem-ui-timeline-pinned-event": "20638091112f0e14f0e443d512301c29", "timelion-sheet": "9a2a2748877c7a7b582fef201ab1d4cf", "config": "ae24d22d5986d04124cc6568f771066f", @@ -107,7 +107,7 @@ } } }, - "agent_actions": { + "fleet-agent-actions": { "properties": { "agent_id": { "type": "keyword" @@ -160,7 +160,7 @@ } } }, - "agent_events": { + "fleet-agent-events": { "properties": { "action_id": { "type": "keyword" @@ -194,7 +194,7 @@ } } }, - "agents": { + "fleet-agents": { "properties": { "access_api_key_id": { "type": "keyword" @@ -1705,7 +1705,7 @@ } } }, - "enrollment_api_keys": { + "fleet-enrollment-api-keys": { "properties": { "active": { "type": "boolean" @@ -1736,7 +1736,7 @@ } } }, - "epm-package": { + "epm-packages": { "properties": { "installed": { "type": "nested", @@ -2211,7 +2211,7 @@ "namespace": { "type": "keyword" }, - "outputs": { + "ingest-outputs": { "properties": { "api_key": { "type": "keyword" From 6bf0e731b6e6dc250a2ec43cfd1af8f2f201ae3a Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Fri, 24 Apr 2020 14:38:28 -0700 Subject: [PATCH 07/26] Extended existing alerting functionality to support preconfigured only action types (#64030) * Extended existing alerting functionality to support preconfigured only action types * fixed functional test * Adding documentation * Fixed UI part due to comments * added missing tests * fixed action type execution * Fixed documentation * Fixed due to comments * fixed type checks * extended isActionExecutable to check exact action id if it is in the preconfigured list --- docs/user/alerting/action-types.asciidoc | 5 +- .../pre-configured-action-type-alert-form.png | Bin 0 -> 128674 bytes .../pre-configured-action-type-managing.png | Bin 0 -> 138021 bytes ...pre-configured-action-type-select-type.png | Bin 0 -> 274678 bytes .../pre-configured-action-types.asciidoc | 61 +++++++ .../server/action_type_registry.mock.ts | 1 + .../server/action_type_registry.test.ts | 23 +++ .../actions/server/action_type_registry.ts | 18 ++- .../actions/server/actions_client.test.ts | 2 + .../server/builtin_action_types/index.test.ts | 1 + .../server/create_execute_function.test.ts | 61 +++++++ .../actions/server/create_execute_function.ts | 4 +- .../server/lib/action_executor.test.ts | 44 +++++ .../actions/server/lib/action_executor.ts | 4 +- x-pack/plugins/actions/server/mocks.ts | 1 + x-pack/plugins/actions/server/plugin.ts | 5 + .../create_execution_handler.test.ts | 46 ++++++ .../task_runner/create_execution_handler.ts | 2 +- .../server/task_runner/task_runner.test.ts | 1 + .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - .../lib/action_type_compare.test.ts | 20 ++- .../application/lib/action_type_compare.ts | 29 +++- .../lib/check_action_type_enabled.test.tsx | 141 +++++++++++----- .../lib/check_action_type_enabled.tsx | 145 ++++++++++------- .../action_form.test.tsx | 83 +++++++++- .../action_connector_form/action_form.tsx | 151 ++++++++++-------- .../apps/triggers_actions_ui/alerts.ts | 2 +- 28 files changed, 675 insertions(+), 177 deletions(-) create mode 100644 docs/user/alerting/images/pre-configured-action-type-alert-form.png create mode 100644 docs/user/alerting/images/pre-configured-action-type-managing.png create mode 100644 docs/user/alerting/images/pre-configured-action-type-select-type.png create mode 100644 docs/user/alerting/pre-configured-action-types.asciidoc diff --git a/docs/user/alerting/action-types.asciidoc b/docs/user/alerting/action-types.asciidoc index 49e7bd1d77743..8794c389d72bc 100644 --- a/docs/user/alerting/action-types.asciidoc +++ b/docs/user/alerting/action-types.asciidoc @@ -41,12 +41,14 @@ see https://www.elastic.co/subscriptions[the subscription page]. [float] [[create-connectors]] -=== Connectors +=== Preconfigured connectors and action types You can create connectors for actions in <> or via the action API. For out-of-the-box and standardized connectors, you can <> before {kib} starts. +Action type with only preconfigured connectors could be specified as a <>. + include::action-types/email.asciidoc[] include::action-types/index.asciidoc[] include::action-types/pagerduty.asciidoc[] @@ -54,3 +56,4 @@ include::action-types/server-log.asciidoc[] include::action-types/slack.asciidoc[] include::action-types/webhook.asciidoc[] include::pre-configured-connectors.asciidoc[] +include::pre-configured-action-types.asciidoc[] diff --git a/docs/user/alerting/images/pre-configured-action-type-alert-form.png b/docs/user/alerting/images/pre-configured-action-type-alert-form.png new file mode 100644 index 0000000000000000000000000000000000000000..e12bad468009af1ca2e94a0161d59e5814b5d431 GIT binary patch literal 128674 zcmaHS2RK~O*0$&+NJFBI6oMeiVDy%V=weC?g^mZHV3p z!|0+%|4;7y{(E!(oB#7XX2zVe&pCVTwcquwcP+0q)s?6z87T<}2&k2xC~6ZB5aS34 zNcPA{fo~ivMuZ3mE-N`GC}=7xD1bEKuC@-&HUtDuUMK658R&GKI&m@Ryh!ZmX8y8jq$^KzwL2Hm=x|{t zabAmCx_@jn)*^Sk^Y(laxD`F!mBsw&n{Y(K-IebGSJo6x5DuZd5yJrse{87^L1YMpu)s2sA)|8&0D6DmSn#VugIzU)TK3&o3DOT zlc$jQoUL@9jcM3CO7`Zp!cvxo2T6AwSKB6X{aV}^XGaH+1~F3VbW5*z_Vuo0bnPyH z(Y~^*Ch?Ael1Awa8Sk*yHTvdbBBA&Yh8Oq0Tw;Gga>MOoNGFIY!nlF4VJ^|1;suKC80h0gIuypolkV<=9id-=TJLhv2b+*CHqQN(=l4Rw}0lIpe` z&2zni#=At{6TVz8xO#CTlh&g*SOIca8A}b;VvPBaotiu7s(krg*p)jGmWoPK#I#?| ze%|+`e%VTW*p4`^JhRpCeQJM4^0oq!*L%eUYtLk_hAA%RWU%j1$ug=?T3;Ej1v}j ziQYz|c`IIgbT1eUC$$ZX?mH?SB=n6t{eI0jVxtvn(ec@1jJ^13d3lb(b?>VZ#ovgE zmR~#4?JGs;EGAO>eUoWhaCpWo!R1rpvEg}EoYj4u{(f`Z3n4>sH4f~J#m{3uyZNo% z@14F^FmNe#DJ8gnp){2JNmOQdLdYTxtKKBf@th=O^B%lzddpI7k4*C6N1zhFE@tLESjH$o*_Q(804;8lUKSK zA@D4C>^3%nX+DM+^!~|>YvCV34o^64%iX|Swr151E0*PcqxOV%hY5ZK5{p!rh@ZqL ze7x=#^ITpaDU9)*Z2^n;<^9Lw_IJ}?sLKj{=dx!visqB!>1XuhoOr>i#Q$#eyZ0W+ zM93voDywHHZ>g4I+{4!%RPb9IMqM+naUDD|1jcJ4P#;v|Qp+$7#4+pc?0 z$#PQ*m8$cPb*>i}4xxr99i{ef?6dC2q@<)Ir^Joi)>WKKbGKjQi zp72e7S@WtU#yi?O;~-2ufAV|C@~1t?<7@uBXT)ch&O$^K0t!U*jo(QbH#}{SJBd6{ zVTp__p)t1mp#EMRg_X`!5jU;BVJcx7%ctR!;*z{6H=R*0<$t;9hrfV7%0Ft~dpUD3 zpj2a^c93?MVVPmgbwuX<#oJ(k;#mk0kY>Fyw?Qf^)Dt6UW6Fm1iya?^K<9MGNjTA#kV z za1m*;pRlrZp?Bc`8#{S_E$&7-uv%x?pu0{Z{PIa!Z-0?@{@gWR(3br`fj%R-wa_Bd z+RHfI=&=F!15v{oqXVOH<9kMQh8s2Yu4>f>HP~`9o9SoMFe^);3EMEW%w87b$dcL; zjCah&t;s|01Mg06s&&SVtVyPEj}5Agwe>AXKMNsCp4gC>iN{@We+gTOQjf;b5`=E z58ynpDR(M=@Jse*KrFu<2i}03{u-+`;{anJTl!6-TgRXt?gv7}e8mz|cb@zI`b;jb zX#H&`BEv+8FWb0#gLM(?xKxn%rV8^5(}hveQrD^|So*%atd*l5i)Mf^@xFG6z9ca9 zHd)}%YQrl3+qra@7>Bp&@Y{U%)&<*dnXm1>X++Lmz2IXPvvl}6tr)KO=$T4_`oOP` z6CV#d**kd>COc@DBs|tbZzSGuf2zaH1?KW{a_p7=iN-@M&*+Ma)(X_i2>=|XTIRZEKe7IFMrYOR`b>%cJgb**E}iDLU~^G37!h+ zSxffq^_irNb5Y(%j;jC0?4J7zs;4*-R(v=vFg{sv0#ESp#wU0T!fBuG-5XCxOzh=k zP<2TZS5f)6q4PYyIBS46DhZZ+XNO`ZPm-w4vbn%bvqxXDhZa-Tb@34Fu!<&ZB2;c^ zb5I|oR}0X)srPHm^SOACfA{6?TOM|j$j&U31HB**La*C-ZM>~gV(C@ixOA$xXuu}h zqtZt_kuzA8tWgtZJ<0rE+owN|yzWiht4PS8I;D3uh~U4$?`(=g+i!d*%Y8YpYg1~o zXp_yb%aDCx^NXLZd5^c#V4!};W98W9n@xg^XbKtMELz_6(T~Uu9;Gs8gEk{*{p!Z5 za#3G$-2K_|u=>ZJ^O|lKesC!1ov?9|(U0UV(1F&(>)8!w3trbms?vCeG9uk z`O_iCccDb>M+T$gx?`8CH-Z)<+iYCgX ze$rYMw)t4gDnRF{&SZ-gnQ{7AI_;_S-XSdf0WFk8M6z*@eE-Sz8+1;nQb4S7oEJ-< zz6TRj-RS!A0J>hLB!Pk1Y zG}k8v9(rx1$~;79?(%m8ZMYmd%bY&M{b*C#j@y)8k_p^aJjZz`ZR;El z?%2`yIc7IV$qd~Z@jL2s5Atq|M=x)1AE|7Wt)|lOA6~HR9ky+Lo@ObtE;}~k541Y9 zot(VtYV7|kfVHt3F?xdD3)v3eU~7`eI!ZcSG29yJ``AZk&fF{<6m#ld#$Q{e(UrKZ zYkcW4jqn|!7o(GN((EJz?KX8mH}j?OpNO@x)u803oW;^qh2O5f@b}em8HIEZj1h%T zGh?W;la2RZfnL-%&|Z$g2u)27nF#yNvp-*63$P+3_;l+9e+3#nv*Z38t;kb*1R1_b64=6iTsni2#8Ny4pd#kCb5|IcvXFR9!1o}O;v{QN#X zK72kxe6DaiegOys!v9c^Ur>-2ID^;2&&AWym)FJP&Oa~mf3Krx<6#ANaPxFmT0& z29u_ghAWkoq% z-%IP$Brlj3k2<#T@=5mv66RX&9qE9cxcl&!85P$xG)O#3upo(~_lcy>zj1gonm^n!r!zh3(96GDmM zG4nm@S7Zq;5&yq0ZiLXBz|&+(hzsd|9s7Mgqw)*c(l_tMssH=Rz}+}BlhyO1O5=^I zHkS(J=d+)mmt@TP_J8Sz+y1{d`p3=fI|(0=!E;01e_X+WU=jygmHf>p6f@Q~H{ZTUe-qkydk5e|aX^Q1YQ$m^Rvl9iI8;N>mG{ z8@bxxo#EQnDHUQk`byk?*$0?KGD!1b{BCRI{1r+v_k%#0=t}JBlm|5)eeUvcQuu$l z6OIJF{ZdSao4I|w=5%9x?CL?YCpYgW-KS`#gPc1Y@kQ|xF@uVKwfcKmENx$8B^UFz z@sl&y(XhJ%HGZ8%nR-FHlkv!sIM~D;TO9hgb-W7j@sszXJgrOEBIB(@;Ng$N29H%@&)`08JL z9w{3vTYCNwTNYVaV$HKKHQ9JrFRR}82D;%@6sh9G20wV)&yC6sI_qU2_}>{b!OfZ?qBK@azWGt=m%mMtw8EBhN%ROtqb z6QL}w*b%r$8$ZEIZI5Q=W;8)vjE}AoY4xfrVQTKGz*2ouPgTp_ku>8hl^5Fj60DB>~o}UY!Fwl(^Hu#S20X z?xYS`lumHt+BMnnSB_r(%>}gx-^-RJJ;XlpOye)@6Qf=z?kr>)YvJw3Gh$Jc5Ee`D z8`XL_mOvJX7P&#|>JOWu>h%8&n+3kX&Y)C=c2s>tk{g^w?A56>oD{1!mx0Q2Z}u=T1|#VN6-QWydqq*i|z}C{wjt zG~ejQgl;h&9sa%&Ewhzg{FDb)ntp9ff$vi%W-o%C!P& z9HAw$+HE}qyu1`$)Z<{Du7Ai<*U$IJW)a+`OoFQeqTSJfr)~y~r4a7}72gO&84mfOO zLoq8|eDNw1WI3vLD@WlKe(JqQ^;`n@(O38z~2e7|-FOF1{C zG9o-owbhtc7N zptvFYux@Va)>=(3WYancT#o`zy#y+i$F8nB4sab#feowkih#v_aus6(_4}(6D-)*4 z@+CGJ_S-_;Md-*E*6%f=95=X)1oD&J=rO3#shlu)4XK!+1vQ-#Jq{T zSCs#MT<@1vmk1c_{0f#)^}w5D)R0u5ROvEnD~x;52Aj6QCT>h4;mFByw0&PmXJJun zWgzaF@-3M+vV2sS>wjC8$g6I_CJ&!beRQRHFOs^OW%EpgKXee>ctwLv2!R=I9F0Tr z4j$t6*i%&a0JGx4_5ZzH0Te;p#`x8zCG2Tos za%4=U##K4;eF~8<0Hr?BRe4J0byLP6{dzv_|KDZ>PdRkbKRI~P^M!Y(QR{b*w2FCD z)Hc+qXaBmC$?Fj!9szC3ZIV?Fsk0XRkzTBh+-YcfEysc+{5xbm0`bRpcP z7#=SXN+Q~*W}VGO2Zn)3yMoBNR~)N86^a%p3_yR|tE;5V?{D@}q*#7OlSYZ^Dbfl? zQq8TCsLV`-m{Z{U8gkP{8!fPf^Nv#iRTM?$?D=YXyuaNeNm=Jpyobeexxej*`@x!^ zRJQiC&{30NZrtf8u>R)v?3{cdnV}vt^`CUR)?~0|gXjfE!y`@H$VCSG6Di#f<~ zmt!gZ26Xeph1WVi@_6jF)|9`f9r`LpHRp_VN?GkaSu;x1bxj)P799(rT6Z=zW*5SQ zFb%Q44-vOMj?WPGst=F|5f>vx|1Es!M!cZHeP|WCPOjf^1a&`uM}vMt0zb!vy3>!@ zaN`{twe+tWf$iwv01v$JcOH0O)Ae`AYU$^@i7|YFhhqGkeAl9w46D0h_AGLWjS`0^ zWJ~=m+eT44PxVfG(JQ8CkH67XawDc#4>7S`E=OxX*a>9 zed(V@43Yrvc}gTMS`b14fBi~VpVNA^D$T`M*wE|p-<|Uc5Qy>Nu$deZ=MnPZM~;S+ zGUY|4qh>oiIALU^ta?Vl#9Aq>xG|_2fiVn4$`lXaSCSLINALw3P zrNlKJ8qDRLeRG%`D%8tLXT#)b*O%xqj^s803kT*>zUN5h1&S|v*AT7qw>W~K)OEP7 zo%;3YJ@POT+T=&)YF2`*6&}+ac4}H}S|x)Yurl?xuo&X@{DBCNcLH2m={INnM# zJQCF*rbT?EKmqhdwR6gESTM-4`oU0N`>R;_%%P>TO^@o>!)s;dYpI{l z9EMzl=;B8^)L7X}hMeVW=GBTy`Se6pTq7cuOA@+u7&L|Cw5#*6kwV1hWpJ}{Q#Eg`$oS)T9dVAMwX)bkT%$68XjxTH#bFgj znFZc-@IhPO=C=dZ;MQ+MgydCEf{%BB@ zhW1F7?1e^N>)6%@i>%wH8v1kTe;?b6L*DrV?%u(PBPkZspWU?6zkfTv+qKk@=lBv* z>W~OhhAI^G4MBIC?Qk!6+BDNbfb{q)aI=Dk!45_?V0YkXueNDwQeaa9^sQ{S*z|Uy z9cD`ik4jt_tc=?0M=$=TpRSM((RG1`A7b|?fyq=3dvj$`tO(9*PY{Jwmm<8*JU^)pwZd^QgE{e_$3wuRWxGLqs z(!~_NV3WMgLQ=Sc+Co+J?_{Mxj-`-6uY0R<| zWjJ@^RC>{QZ}_}>|3Nu@)Sub6g*!R%Np$5|S%$2J>en#PuR&LlcL?cjTV$RY=UnU3clO@5oTSz14G>8D|84EYbnNFOJwdlN6JRXv*Sc%K0X$^B|M)vAjb zkKrym-1B=5w!tJWr5xCa54La#LP%d^897MPkWl1B@6T+``b0BBiDTEqbi4+X1{*z3H5dE z@;AP1Fw)vpAe-f5k>E?K-R#Uq@(J1c=cFI=vj$BGRBS(HI$n5qf5<`(i5*fThJQ+e z_6*akTBzxLir;l5V!bN+E|)^}1QDx>6ju@VapvznTtgeEZ^dP}+{@{R=5n0vU{Z%{5(Mp7N9w^eMWa7xhppOUBc?b>@M;HdR(8z$TUl8@02Y z>J95}YCjOleaRLFMiN#9c4*7Pv1aO*BX+50A=|ZsWtU*V<3t@DJNF^wr8<>?f3ZLDe$Nn zzt3f~kmvLBp13>BsWdF~ag{-r&lidzyEf~uW<#&)Bd!7_`d7wc&m1fUJf5N&ZxWAm zJe97_4NBaDx0Or9fuSben&GOT)PJCi!sPZu)%Lq!v|3akQot%qWW`@OjFyevsy#Z{ zJn#sbr^3EAmai2LsEf| zhh|NmQXf;j0?FX1IqP2VXuPO-Q0@*W{mZSsw_x*jwPVC*5q)sjRKR>jnRFtnlw(F8 zdVgdRj9PlS=_ywT_w#k^@7$vd)v^}#cQbFqE98v31laiuBNxM^r5Dw(fDK8F(6f}F=B@6 z@HWfIJ=iwe{DS3L}c(sbqR;#vt zSo2NP;L(@@tqi?*HTB3vh;v0}`+J+@hlxx`;SSl&ebJeut9KrU@{PK8u+kMKQ8tY! z+MRxfrjAH|^XF@q{s!NAJtd3fUeq&i7>=K3$Uf6gG4o$puQ;xGWBM7xnM(>!HS^A$ z^4LO*Hz7-dkmb^=F9(0JpDhAinYw zAcV@?mPuNh`jmK?1s>I0r^Qx8&u3BqF@nwMnS=0OC1eVUIOBJ@al#*|h~a=LHH5|) z!9jM-r)GZpV0fQYb+c}YKXeQ2QNCWkhRsDcwKZ;ynk#kZWw^44XX|J{l(FKwRs9uD z-*!@~r(1!1R#)sg6E&n+>P^%>xt8|_4-4$B)j0_I%*Y#Brm+q}=G}Y^XEnxEM{8N*M{P&ev1S+F{n1gmgV(=LgE7`xocG-ua;7(ZxUZ`gtoZ&~`ghVmr!rMzt-Gn3ug`AjdhD!ClqKiO9rKKr8GYE|tplzU^U21o4q2ha3h&j}y`Ad=Z0q zAUFCd&h!W@8n5C2MT&MgzLQr^9p{grI3uxLaxNqMkW0O4k(s}>pMQ4SHAaE$c2Eb|KD7Vd}V3UnxEVcS+{|E1wyo=&oT@3Y! zvc%pf$B9$vl)h1QMPFZ=5U}{6vCjt8MBgx#Ha{+w=kwwAW;#G$*AUagN*u0Fsl8fK zp}=7whlGB=-c01J)X+|j_M{2flz5$AnK-XC58|8Nk7JAqs91A73^omFp#2a2O%VKy zm@pW5(fv_WG9=W+<#pgTVcjXP&3-&6tdz#R3`SBPTjXF-H#OK`Qh@v<*5#;j8MlPZ zB9D4)HFzE^BLr#v9j$kxOnKbZ0SK4o|Kaq zUM&)Hwtk|uFwHk=R_*Qfs$H6N(tJ}&YgEAC%SBwkR>B377^un!2@_TX*##Bf`Wdtq zo?e9BJy@$)Jt%mmppV;9U@QHbFwg>7&2Qh!D>)XU|LP*ry zgZSOTIY88OigWydJeS$EcOnHChhNuMQRBYYM{K4bJN8Tw*uIh>>~-)|hqr|NT>$5duI$~huCF)9d z&lSC2V-OFv!!nDe&)a6exSfj8M&4&roULKhspd*?DYJo0oP+rqqpOLV17)t}w;sB& z7zUyi;rjfJGo@!fvlk$%$8m2cu5)zl&E|J&tMJ}K96#XYDXsf(*}x7)?J=F1QrpC( zlizipC3hrm`*=o2UFuF1Ryt@xg+>x&5@R1Cd1E5$V#$4>y}|bD!k#3jD)KJC)3^}( zlKR88-`0lQCC^V77QdH{rkW#o7dkZDSa+9t6K9$NAaUSP0|h+;_GUPjPY|j_87b?c zRkn@e(!q6T$%N53OnY5uWQg#sq>PiNnIq1sPeojip5L`zmN?XqeAk=4)oAY8Y-Mi- zURI!;;oO)UK4`63hj*tupADrczhsyG^h#oY#uR*aABgV^hmf;Y+SWxB-kcm9wFNMM z#+`xP_m0z3urY+q+9S1-^`_L*{W3D8rX*APT6yf(nz<+CHCweazTk!?yDS9XUI%5- zLBPCuTbxBy|9ta*YCzSyKR&QwQqg&xoXvS-*nXiBt)RT17|)oj*6Usjl7~ z3E17&{}!lxkUwSq&Sw^(kMh852<~AU7Q2c{_w}iyq%YQWDq2X_Y*Gz5SNWSxBd7dE zrFH;zX_JbV{(PPnE51rT?w8NvVIGOBeYkNI=5O2E_aK5tcz>%of%&Mm)h1hJBlEEP zqMQH1I9B@LmAq?=iS%)*mbfH6o0m(*<1 z@(;=p$7yy7bh4Km+n}v;)I2bKBg$o@*bqLo&Do$n8?rXM|GfF^;0+I7v!b*8octhX zb|8lm3j(Q{DPGdg?bkhOyhXe7%Zk>9r^GoFP6GGVFbir`dj>UZQy2N!J}2Qa%#Egt zM5wgvuZvIYM+=<+NRQj;=8Ju<0+^d8p63u8ONrY&=`e*KK=2HWGYqD_S`tDc(UaKm|0fcYa>t9k9)4zXY)G_th*SiH?yqzVhwH{%Fr zIUen=XwS0L3~#5m3;H*EC9k?1JWm9n20QP3g>2y}fsuoT5A)?rbwQ~E+{IJUINM$q z!{8~Y!zs>Gv%p-k#3M&FZr6tWrT&U%cE#h%`V&-H)MnrW@hwWS9 zJHA$&9b8mKGcSTEs5kS`_z~Up@8N9G#fsf5_dcUxB<8cWYbD>l0^m7O*9KIj*8?Tb zzv$9GWULRMe zDAZ?y4QEG=hc&wh#JLlqw9k!et;#_cZTM`yB{xRrOo;!P(i);)tL!4upY7ovnLCh! zwvpR|YBjBdd2A{>1FCHEUHB@;ZmL;lKopq0 z+G=y8B;$0ayKLuskW8$zt-Trr??X!U-Re&pHIp06x3C5}J-jtzs{Z@yT!|bSDf;FC zcPjiANbuQrI@o-oC)ce_x3CSHUcK)+qFH&$n$91)`8}z$ zz<6xEey`w?m|O36C*CM1f$d`JI_e^rOdq3_Ok2At(R&r=(Uo(S6s2&TD;XTC4 zEOt9hH4cmQP;V2Cz9Z1eU- z9V!ZtX`5#!?ZfUIo}tzlm@tNwtAOwzx_6*&7AWm{!yqVh3jLF>an1y?IhJ#l%5>)5 z^J_&gV3W|$b|v?taq3UIr#WnwCH^B2+uqR>iywT~D_{3A*klO|Y_B#CzJftYpb?~n zd(p%Z(8_?^(M2=-BT&gzajK{vPEG2zPse)qB|^q z5+y#O!as7p;@KZ2pSZ8$(_1|nZYF(*to+7pc-qPRE(>vRq?zqGYVK3be2OPJgUZK= zjC~oI+>F-`7KQ)vDTP0%gL4H>4Ud}ehlIa68LV7wW)E@YH`ulffsgT@wsaPrIBUMF zOWe38WD9-4-@Io62p3*)lsLv!MnI1%F8p4| z6qRWNG_~{x_~Q5zKPK0Vn*$O^TUOxsXm=Cm>O?T&v83Cql;0hhj`1*9vq|vOV4ox> zXSTL6wcY#u{EL(FIr~n%6`voEQf)N^R?qv;W8@lPXJRdgGGkb7ZmwGJB^$;c564LU z5Pivog)UL!3Y*|!K66mM7rQ*OCby7$wYK@^IB372CO*`Q7@pO$>O?~h)f?w;x)X+2 zs{~`LhWPvUp&pM&j88TzYp0G6Ggc+r9a*BSib{OQ!AjLjMOCs8 zutp#wW+>ZVX6_Ii1ztScY+(DSHYrk?26Jmb^@)!CjC&tQP*UGRI!~^S8kG`_kEq}t z{T(^=jJ=?K8^a81Ues9%KyI^+3}lsnF7X$nEFSaSGZp8}qWpAxjIX@VBRiiZxK*Gw z;xh?j_|2wYrnX9zxiX<#eeoNkHp5W8PE+6?oJ!&+15aS4SKgYk@8U2yv59k-j{VSv zk>;hx8Lu(~l@PYL&3yJHyWTW@E6&r>oXfSzfWYk>VOp;CA87KPkc0?AwOG-s8v?MF zLpxq%6i}-K+IwDARZ*gBQr6h&AANY4)K6&x4b4&ro&`DAJ~Rt$L+#mKcmx9ZeY{~rN41FvOSAx7=hS4`w#C@C;$10L7Tc5sv=;KzbCih}C_K&1PjFDS&M3xu8Bh84 z%LWbh9t()x{hW9N>(L;|Fil>t_Bb>wc*a{-R?x!vAbxG4`W%a43!4Ab7}zZByCqXG z@RWzt=jze(gZ1%eXJg|8lnb1y@od7c0(N_A<%ccKnYyoH9+4>N`BnCc7#}ro{Sve7 zF@T&!S1OdvJ|EnNe>p!1OX2P60a6ufq~38fn@r2u$!RzLB0#(;poYhjaZDI64jc<- z5&We$YW_Z`u}!k(qby%;wrgup*0OrQ;$ndEiTBL?mNv0+^<6rH@`vm)F=_Ma7BS}t z&xdJxy@%Ff@c(cEPoMz=k9ToN8kS`PS_z=~)cHJ%q;QeQLhtuDu+^|EU-DBwIb`Wt zdR?C5)cqn}Nc^PFg-mylm*T*j@cK#FM-`Tw8>FMWi+(PkRAVl>>Rtt!lZ-|{`P1T0 zuIeGZKjxtU_{I0g( zTkf)Z{TFP0OVH!s`D1-pU~250Kg5uC%H*#IQJxb;uZlkHu%5}Wm<*&iG&`>SYRN3h z8e9wn;mrnRvB${DNU>Tvs-MFDXm@+9_%wmbsUjVy-t!j8W5w^)Vmm_yi^>{7L{)ux zVd+mPa391^%##+nVVjO}gO3=@Q%1>*k%*)_@eQl1Yu1?lhWYgxtXC9lGri$WcHprg z7P9rVv0TKbseWmJ6i)3I16-jjNv1BOss4ZJHXrn@9ipzh6>@za%_`cPNfiRAicslN z{zLWbUnblqg{Pp$FHS$9W!2YkCZWifa>iR2L!gaw$;b%A0RDhavqN&{XZlxY=pS_C zUBOHT^lAQ1*rrjvSwc$Z{+J)7l*MloH)ex!8?WkZAk+loCA3en8$O<&<6q*Xw8?75 zGoiQ;&7eR@Yp2%#5ajO@1<7$1Iv=t-s_NwClz>ROXsaj#P9}HdS`} z4eSsHGD{iKud=21A1*&=s!tsWx9!&X5&iEv@D*85tgJ}9hnfnnTxDK<8UdCkauCvd zSKS=IN^SANJfKOgc08b@(-8*31DGFbq8(D_%m(*ZLM=FRAuvrB=i%_V?2A=w=f$%e z4fI*|=;^pYoE}UR$X^wk5H(?8Cyy13|mD`9Ba^5 zt_jusw)Jh2Y=d7lCoTx zbiMF;T4Z1%7Y9+V&WRCjIDZ#I73QAdT=Chtp;xbBr|Zn7jZQ!QoTub&iE(X8$ocb# z#=~AF=~e*n6SiC?awRZ0-|QM zJoY8ZkQY#Y32Zkmtu5_SAM~AUB?An-z4i4rxNzLET)R^Q`r9r)F8;6Ld{Zg4xiGZc zsU$JzoRc}I`1I%1>YNE*9L{s<{wM_DvJg2QIxTpjQ-*4HIsbr5#XU7TA9m< z8$MHD*Im(R-^}&$Gw*?>08be!EyUG!>fanrwGJh2VG$!58|6~N{v-ViHh)j8< z!eu>-;m@Uc2>`_1@Mg56@EU=bLqP9?VxUes+2bDg$)%5g>^P1xm~}XuzR(Cr&-6c7 zXJ{Ery+no_qnySYEPd65Ke zcI`J)dx;&{WiuVK-S;FRgz!%faugd$r2vqn$3B`sgxW%%n0Zh69X6^oZPXb5ZboU~ zNcZDkdQdJ$;5`oOYkVrf)HcBV=A{lGy2l*+t|^j<-Wl;3r|Og8ReA7P(cW*fCnrvd zF9(qQz@sKQdgd_bXWN2}iE59cM6v=btxQ48WVE!P zj$8h(~F+blas;qmhuvvDvW@tHWWV7U1JOA!7&vRggm$&?6E>+;CDFZT9EVd z+@y7GvR)6Ov)8!)=s;qt%OO8Inc?<0o{UrX z?*94=m-^R|+ht1f-7kf-h+ty`H+&oihet|sT9qdI4kXqS7$T(iaaKS@iHSti9KTzD zXg=6tu*viqiG4o1K3=(47S4JV0(uM-ki7e^jE>b9m&$JTRAQ4m&i7xz1SO5a+k2+`Feyg^wG;q8lU`WAOumr5<%Pri;ZgREgh#(QKFm#3SPMyFOLu^#-vOc@x{8&w5v%G12H^1o{DTVzgI#V_Kyn)GKFPm2S z!EE4(>5#FBrfsm{rmiFC5GdCq-iZ_E^YQpyOzpbIkj+0`KkWV36~DWEA^k>%?YaHT zF&Rr;^Awh;VHSW+%2FuqeInWowmI?*_q?)6wrE7;_{V|`_x zxaq+dLbSx+*l4LIlc&l5pvMKi?%Lehp5go^^Dui%_67h-u={gWC*H3_8l+Z|25rX5 zf1DR?x`!^NrXJ29iYy`+j37e0KU?FvAo$R-w9tw;nFGy&@y{jFunA9yVryLi5El0V zZ~&wo?+1&Nxc^&lhb4}8ZYEM;Wt0?9a)Lga%q1M_o22!a(*DcY#2IB1%SDJP3a9*g zO@#xtzT$LV7>_01q~GmH-*q>>Ipi5>rDiAo(N*}ag~X8v67$34g`Nh`^AxiS7Y7=W z);zG>OFM*+tuZI(c(M%zzA@|Sdt`9$k=F3Icp{o(73_T@#j%}nFb&N&$y z4%&9aGvmG1%cr=HkMctbJ0uj>ws5>DV%-@H$@SSX6Z9B)aP(_IgOc>~dB*RIr)d%0 zUegO`kFHHXUEw0wOYOpckA3|4uG*SWu3@7sk(BCNNgW_1^6r?d_8=1-Q#kR4rMGSC zPss80ui2>S+F=ilAshYZlD&=T|@(@{x6 z=6@b&$3mvv7I=3Kja}o8N>7JXfM__+n937hspVHY8JLP87-bN{uL~{W z5?9eP=k>im-2d4nw7&k{dvk1t`f`8n^$;R!E&7E-Lyx5>s4zCG0Tgfph^{GS(+m4- zX$T>WKj{=fusCre(7ZQaELE7?@JJVfDilKumwYgv$^iuZv_qpq4`R6Gir?;1=c4!r zhxd7DKdPPZ#h>uQ`ljqb69F15O?sA8s!`Vf(YoZ;@)4t+A)O&|rG@OAT}1QI&|YVL zwu3o5oS|5R3T-!wI7p!uWxflr^FTLu+&h|cO0D4di*zaU>41kzeB_*9fQ#D84U+{` zJ7i!aGH`;+eI}uHlj!346TZ5i35|j zQFBYk7W2I$OS7DEa8saR)My~7|B_4bao6MZy?njnSzjesdp*#q`3&j-n|#1t;`Jg~ zuY~fVcB?tH;}_upg8NgjTQ!ZK^{^Yztl4b>%Su0J{=C8g6v~$iZ%*D=b`m@{^CSCH zZ~$HT9V60yc2Ez!YexP8%LRh$N{o2xc7t5Gm@(txMqGA06IP*ML+a~MPK6HdN2LzW zbFj9>Ob%lEoEzpYwLqBPUr1??3X-m+$lq_V8MblH*N{0gVGYE6f2n2w3lKS81k_7T zGUoC!PoOCTYdUs68=o2U=7wYXM6D|ucNn zQwKAj&->iZ^YuF4TeA#vQvvi*Fyw9>n}>U?e7(YX=)OAgdlSB-epP8_8P|h*iL75^ zxm3Se9*wmB`8^z429p(LjOt3zVtxHew~v_>^F?4L&deEsiC0OiY5$CMsYN`l$`U^# zw@@T%S<$tBg~<$x*qdphQ6RR_&8i?)=jvKq8e=C1DhD9l>V3Nm4LfmTv&{f<;KzSd z1EciI&y2Y05Td0b&tTJ;$S1lWgp#mw3RyrWcef?xc&=FLgsLvR?%(%9&buFF6a43a zit)h~O>p>$g3!TjL3EkksFS;fRFb8bYzE$7FTJ7A1T#;dJey_KF zem8keSmI&Sq^8k&UC{+CmhtIk+i_ZUDM764?cjJ~)!S~6;@kl0{8#KLs1G;%Zf->T)|D&fUeWW0#Cpk00Xr2iPa@nxzrP66C z>G8)BdHn<3sbfYCNkz{)iWIun6oqv%k&o>eGVa{q!qYB%S$ZW?6h=c=G_(Hfe?aU0 zat`n~o`*J^3%O650lY)OCIfIf3~RH{UY`|eWC5Bm7N80LktY6o)E>+AP~2v9?;*emCFR%(-xrjK#3>!# zRH%Q<3FwSR01GpR9+9Qn-j#s-besXD(-PKVK#7;}j7rCC;VLL!7@HA{c>sjMG-;*K z@L+#lU{-UKCZ!P&oer3Z1GkBhN%b!v-StO&|B(>hqs7G9S$^_;GfNKBkg(A=7CB`4071A$k-(=APOp3&U>b}$J zG;UA78^48w^A=(Pe)}76Cb3u2;g~M~bxk|ikXZYKN(y#ahhHi(X{}*VvE;0aOgHoI z43IoyIDkGnys?L;5Pk-_CRnkc&{qm{66c!j%B5}O;Kp+kp2`1#F8}?o4-r&=Un2BS zP@8KZ?86e5!OwZURzzetqy)Nlv77DpFM@DZzc>oTIcWzyU|bM4P#d;wPI7Kf!cpCX zbuhN<95Ts(2&bqh8`dn^FKvDo_!+erbL5^uHocTt3`LTz%Gta`8NI_&NmS>dfmBi* zD?+aXH8}4@531CCzp3}nM%iDgtnmU8E<=gq`3GF7x5{q%uU!D=UIR8;Wm|#TXHbW+ z+i2w}bhBhHseHc8?)azx51BKc&As^5)p=7cj_SMP*ms=pGyd47A>rZ~2s-Yk=<|9#X<5pr7|rkcB{Sw;Kv+g1Kfz;{0YS3IG|Q7x{t0P-}4rNJq;fDBlMJhPxUm4cD5+u zCecRA4{lti6d+^5ug|5IX`V{`++&OD9vIoydfcS>U2K2AHIG~Z9OU?n+7k#sAYz~8 z$|nOb?nwHnBhYMPfr)^>E$u(fuJ+kOPP_$RBwrj_Czg7$O3b$&Ky13WFv3pzuRwU#C4Lcz?j zSpl5qbP=WSvc!;=DCJWESfoQmNQIITNcU)-;d>^jc6+s21!r@QFDtGyw+~}wluZ8t zll+g)r8gh&&?WQ(2Aj~c&2H1X0dBOLswwc~rc7QF4bFIGD~}%vR8o_aeMmbX!zOo3 z8Sh%3cMd!(C0Sn3KWU%75Nv^z}ScqOYLowq{!l?QCCL?LVHZ+7@ z2YxUM2+?T;K>8`+e?k)eWeM6JAdB$iqffm9q-_I@N59-Gi~=mg zZ^RI{fAr-47D3*<^a+UY$eqFJ*pvtWsjRdroCJ)ml8fG^6o38xAu7b1hUH{23ikAA z`mF6H;Jg^9*_%N(xoT>KrHGWmt9~*S;31954YC_augH$R1#NzVi@=RMkD+~AZkX35 z0LM%>V3t|`_L6@;E#$E)?YC32j-QUor&d6^Ng{J$4dBA z?@j`cL{z{s1sgRj4^ACPY9JqvD}xV0b&zuE_D^(CJO$C3#bn1(FpVOhC>hJ4BLaW= zCEA~Ni0=#gHcLhhTutm#2iI^)U-pP9^c)J1b+C`ZA;Rr(R+N6{*z9pJO|Xo`QcXoO zBx~eKp*Cpt(=bv}E$!Ek20+8iu6v{_`n3q;CkvxxDgp_Yz;+bYHx##{+zB~<-kba-MkyJGF^O8ta#n!RerKV#Il(HGHU!)mSY3|*nkwA}-IVfqzA@BvEd*-HSAGmV(MaL>cr?9z>Oz>59=VxaAWC|MGoQqP~%#9sTFzk!sQ0uVnc^`5DlsoK=!iP(JVvBPbJnv zu0&S2UJ!zGIFv8NdFR@j8zn>3C9f#6TLEoHObW2cQ+hn9BkdPZItF-NaYI?AqR5KC z{VRp098hgk?97)kI!exEp8vE=q-wUN@Ux2k;^SbV0#PR$xakyr=;!Pn97W@_4WmHj zb!;|qq4>+Ae~?-JjuSD8>5r(S3L{lRf}qYZI#dX#@y%*DrFe3S8aV6_Z5;!$+m91c zg;BVqqM*Zwtnl*0r%&FNkKS@&3umEVL+N4%>|XI}Ro1yuz(@4Pv46X5hT9FsdFqZ? zR_#N;wul@sj=fxbaG;eP&Gi)HOg)5|N{Xi!&Q_$LUa8Pc?Fn4k%L4*d7fJWWHYFLf zbAj}wo9<^iAS06vic=;n2dNO1x+onjF1>JUiv-25$^QdxEZX>#O@fkiaOV#E^KM+l z{%qw&S8S8ruOwm`o&)gjdHO8@t6r18IH*4sDmbet(QYrG%mMAfnf}P5_-vdHy#R(c zNnIjO(VcT45bTc;b}~;60=X$7>nL;(ew$s|3%j`TiemY4O#20ROlo6G^)r;td+`|9 zkDvp_YV;7AcVrDu!@2JIenaNVo}_$ z_K*CORGE?g0CMx9>#no7cnQ4}c^TBhK_Jdf*oWb7+i({RU2nI)lmOPJWOEnuVt5x7 zyW{659>CcnAcgoL;6~9iswt%}5fa>PC>D%fr&cn^Rw!vRzI^HkrGuP1CKLw|28%|R z`YfyFFn5#xNm~5Nqe8w@SskCX*R%sTAhmY~D=^Oc`RP-9uE66lz`DH;%hg`jbpQo< z;Q0CEQxuL35^(%9O8mlAR!Sie!fD0{>fr*({O>TZF2`pe*nO0h@Oi?yr$QuNpDR93 zUD@N3c~Ug!7q~}Iq}xN%{|^VmDIHlMAeB^fPCd6yV75=(&Lo3(DE$=RR_apT+K_&r zj;8MFl(O!}zm5xO0y3rRXeQfvXz1E*8HI%lf55GIA)LdV!WV)=DY>2o>Mw9(omfv+ z8&b>QcyKcL#(8KLaoTP3FDd-|>JyZ%9j(ZKU(zDcVcc;oy`b5rN6fn22 zlijP7+?Rk6SoBt2DsL0<&-3{A8G*kn0}m5bQ2cN!ZSt{>jcxfTDn4wSQc@?T2lB4@ z=W{omDZR5b|7q^X{zt6t9~4RqOl?k4^!g#kfDXT-{cKJ#p9lgPV`Xg9eU_5lg&Z3I zGpXg*1(?Tlqt^yypNDCCbRK1|{A^kg0?3DyccLAOxeVddJIm@qvBpdn125EvdB#M+ z-2R~AIVj-7#qDa!6x4JZd5cQS3&ouWC5pv0vjv9-Y@>(W4U=k@kSv5ZS7Wqq@U$hy zWS!+#zRUpfVqk1P@MXZ2^041@QApQ@vo!K?Jo~B4j2n9y)J!jL(pa zb3<|~?F+dy;^2GRINO>Co!wHvXRJy9JPmTM94X<>4Stb^&7i$&j#&>#2 zmn;k?&w&c&fbkY@e%)ppR~oB!+L&M>OrXXf)}MVi_B7;3dk#Auoi`UT`I$x4?JDKO zk}=hY)$vP{PYC2t5hNEkZ11jhPl6x-slPpGNG4l`c1gT3P7Cy)6&teAU%zs|z^S1_ zO!}=&Jn5&i!d@j`@HJ@PVP+)w{}2^&=WoA(i}s%cyLW9Yy9V{%kqGFkm0f8tc0qdC zU3Xi9r`FM7L-Fj@HFBg9~FKW{jS7IXF5yV;~SifBBG25dNXgp);;D1W+avSuBfZiwC zSs`z?#iZe2wu5%o>8qs9!a{}(6f!lor)h5}WeJ_jAt)$R^8jC&Ys=}es8eIP;Fh-8 z_i?F@R=vX{SyJBdTf~jo)nMbBP9lb%%AcB78I|6P$evy9506!6kMC?MH71glLtWvmQ z*35I9;ed6cpZaXxs;2KEi{?u0IAexnviF3}4cOqn|({6ef7`t{A zqr2`naj!PM8`qx-p}rjpSl{~QLN^^dev{rY-4VCvcB1K{1nC|qE}#U_hhIK za-Es6?xa-$SO8dhW4jwxN3LF>m&W^X-th>no5>)xq zWD&&59qZj+p%UmIkLLj%6-FeI|BX3XZ2f>k*snX zdswkUEf4@GpOj~-U@JgB4gZ;_{^*+M@+QK(=`&uZvS$=5PBnY zRn;SU5!n-ob!qC?xp9{?y#gjyA3uSA^0_qOGU`|N1rcC`NuTE4!t=y@u~^c0x|H$x zX23x2m*>_cjjpfXvP*K+>w->T`=26f)0^DmBw)zzji7z5!H73K)U-_P@)w^O`(Kb# z5przW`_g}S?KEP$J*m0i?y#YSj?~7-!zND`CfBN`9|dz<#-1`3+`MT0ftm#;D)j6K zo{2OTG?8X#HQq64KF#jHoopc|uz)!49*PSz^I|V3`eh zr1DONEAzncdXTfv%L;1MB+(H3xPy&de@{~W%K zY@@5e@Ql}ayekxz608jCLGG!q`mFzInEJp*^jn;CX+xU9?hUbj%wdb|FT$r1FUFQO zvGdBTeT-eM##OJrUk(lz?LoE!B-&t_4tXcqtnu-WUbSK4^f}_Mq=&m>1u?BMYkvAo zB>z{y{LL1#4&{=dNdRts%}UX|KX5-bKSlHq!?Vv*Wzw#Y0DY z4<-UIkCn6CTW9oU81+S5x4>GGA&qQMBgaMBgerd$@ZQULAvylMMjyrn=)i6wO~NjF z3w~%V@`jli$4yU`(x&~Aw->geC3?^%yZFVq?oNMriX;qPIf$&ClOSvclwedoK$nNf zp_BZ4Y(I84Puwt?G^sh&)U)-@{PSzIH2?juTkGr5!Vqaf=S)Ch{eu7C;1AfiMp9kh zu*JoP-Bd)Yo?WMkrAQbOAKtLJWCYk1W_IVc0v>nIW0oZ+>Eb0Po@*4cOU9G?)5X0K z#eKq!pDxk~Yd8MHM9*0Rn$5Wmy4mRo)*+#dA23-9_P})`37U)j{!#uDPTF12UM5YG zy;^ME!bMKC? zVZ3p3%d{nNV2f8r*yuMg`wiGg!+rs7+-%?RX=ubgAy7gdqngA~l15;ZzqLD~gl+pw zvzkJXraeJ>Zuj=OH+vV}qxe~9qR{5ewIT+LZNom6@wMSK7DxMKBt9jGTXD@B73dLf z<{RX2isd{i7V4ruDZuz`#Qn1YpUQAa${ejz!FB{pP8hb0tf~~L4cPmNk{f+(#boBH zm6sn(4p^IGN;xA%RY+FdnLH&68S0;pe9%lQwrTS|a9hvRCu!sb7wkKEU-Em;A*7Us zb|B`1e-JtWxXA63g8Tj<^*J2EvtV(R{QJP_cpsNLesLo{Ks?#L_&a`{EsbU>XcsP~ zxCL6V*}vl5Di-9QwQ1fvZ-n?SKm560?(aKRX}7XlQnhA>=!Z-94$MnO)yl`t7~eYQQ8PFatD)TpqVm1>M*awY7EL;+A3UsYKDDQ5JJG@Z9kC@4 z@aXf8-DM(mdo4w|;?(7*dv}>>)kEvdSg$X&W1Ty&Ny4@C$eG6uqa!wprqU;h^r~T% zcuA%~wmzzF^;K(#s$pZDaQWTHshnq~5s(ayBgM!Xg8be$oo1(s!JJj;wRcoL!d zK`*k`F#S3DZmvy|%82uaRS}0(?|mN0+V6(N^yeI?9JI6#@)Gm0a?thr0)YJ0pQ|@218z73X zpq*ivkybMk`2T+R))}Cs&tDbZV`B@8#gffm_^;`!f*!=q{Me6;CDygt@#V4(&+-|( zk+oL>(cp>5H-y=q&vnUVoY(0sv_T;QReN_AGrzLsKI+rhBsbfKr%l;cwF{o)C&91A-d_~4Ij*donh}by)QO=9MQg_eL(*Z%bY?`xXh zPBGi_^``P4N6GPjnzPuf%}8fL#he03@ulAcHI45td4?0z+>h=VE!(_rlw2i!vC)rt z<{fwb#O%`OZflw^KfNseL7qx=$yTN*&|Veb??yc_#B5_?m^5RY^5-U9TD1N;%L36d zW93_;MyLt$&!}aZ;r7J42{O=Q&e)LZIuYw^MLb-;gdGmq(`eZ#akz-SUXh?IEr79-<} zrv*E)oonBdM$Og^rn8@?@k#dNT_#Li?BbX|Np9YBKz-Y6P<@-0?(wf(qqPp4NTaaK z;`&v)%=vjS&V}+_)ou~WZ(JhRpMKcIcguG-5&F2a?VgS z`BzmXyG+QC+^-^HFFSE?_sbmIpY_`p7#nP-$X_#)B z?_y~@z)Vi;$(0G;Bwk(|mfZ8p8_8?~q2NG)_5N1iSVq)&qF=cjIC;D4*mx-N8)zP^ zH9Tw7P4De7k2m!Q9jSV=Yk)R%M{}HatlMf)HJNO1=3P+bA5KjB3O${0_YZgx=#0g^ z=*H|49IbDyDw-<2-AWtZS`v~p)r?w#B!dW z)~vdJ`m|nXj02K>=~#*G=kl60 z^4~oKx#&>@umVtuj>`Tjl7lM{;%-be0e!FE$#*y@u6e-*sy~&K@UI@E zOm$-3bnte@*X$^?8GYr)&uXr_k*YabQR+FMqA6di;dR45LUxXR9)}VeH)eV=tv-zw zI+&T#*uMYX!j7xxK`u%AbQPc4{W;S!*P7=4Zrl?sCu6^KpZ&=6&}RZdAS${F_GVvD zc%j-H`O0?#ExCc3>8aa!96bm+So-LLBEOBLuy`47q1ID$JW&myL(BMD|Jsw*XP^gE zXO>lDP#7qOKWy(uvaJo<;Q3Q-rH#Kz8rIvBO46!mH-lxdE?vA>oAquV4$mH^tU)W{ zmTS+7sjtS@@vCCn`aGgf19alh$h<{NXsO%z2NF@vG<5o;rbnQ_!Ap@}h97hAL0i;E`e9*1SC*30P-)4yKx&o^(asX10ZTuA*^O;C>8Y-xPq@DuOic$1gE~iW?x5?p zq;hq)9AH)aB$A)w=SmEgh~xN628NQ{*<0k};1MjX zY#4jD^~0wsTv#6VnF{TU?Xp~x^>pu`^$Th~@Ojm?!_i*cy;0NvYq2pnhdFWL&m1kV z)(J&gji;j()iw5KF5XR;Zn{0zQgm3KHMWh{q0Y+B6FsZT{0S*F(J7uIeW`VAN;0C#MgZyddV!t9M#7;|w2M28F zuD8ZoMpxyfMbN%F*~ln96EVVA)O4~$Z@KZh)9y*cbfOVYb_Tk6bYLL7C(Uv8F>CQU zYw;59ur=*T`cW5+gMQfFphCnX>6#`{(03xx3;#0E`*78XL8Y~=!iS13k8@1nLHj2| zrT>6gBJ!S24v7rg=wpb1Js=Aj0}9jF{IK|}S(~L?Ny)m-kir|E(&v?OWp#l95;Vau~g2VpB2I*?!b)LT@O%^Q5 zh{bN)4f>TY0;@e?9)0hQ$++8^t@{n7nSF#IUkbK7%XsheH8CA+36ly>d?UL*<+IRZ z#_3jBKCqv(ktBW8Y{A=``VGmYt_g&ldpac~P}#j1cfsJyNnfb&JC^5>9wbSVNgHJh zR(IJ(!!Ip`u4?j&VZ&LybmQT=_e8O0j?G18lYS=4Wi$j<&^_BWO^xSWC%#P>rMDN@ z3~t3-75{b+PmHbR&*T{cRc&v?Q^Ll+`1Is7XQa`|pUV`7VNhz|8LQLV-%i+AU_-R6 znsWN9a1x_$i*2+_z&iU$MQ3pn^u*UIg{jPxZ=<+*5@^4fs?S>~D$qPO?ZqES$Zvr9eX5*ejz>&%G6BTJVX)ot)o7BLs zl%||)H$Yw++*v%UKxvqI_BMc}o>@J+KneEn6a~hc>^EwnXeq%b?jHf-zEi83OzAS5 zPh8v(PA?QjMVJ!kfb$FhFP!}$Oc~Y{{PqtxhRaP5ahlRx_ReV(z;mUh3ftM)Juyv= z5@sgz*)2xJT(OJP|KIjEYY2Gd5niwGhie zX`X&;mIl1e-qU!55~XhqPl!1dsMr^r6EwcB za_;JtMIxB*_wlp|X=rFfSyrr6v-?<;daJ3cMJrf;Rj_Wn6c~M(U$)CJ?NS?2)5;85 zKI7wBh1&=a9j2sOFJ5p@QA1_$mpkf;eIDe+IWztw-+9n7zc=uB^(VC1s#$)lYeS4* z>qB0Qh|Xo9$gyg{yAqD$SMBWbc{BTKyU*bgtzROvMN8e^z2rryM#WfCNo8kHn!?Y@ zAL5G~v#>8BHCn|-e?`EJuQQ}3EO!mWsfr#lsyioQ{LphvHRJ+nMS`eb-+bhGj&;gW zsNtJLr%I*q)JA@F&UkD4uGlM4miCzQSwY78#3I*bN*biZY4>#=*01LTs&2!yu08UP z>`;}(C)C+5?CcA~XCI{U7D}$Tzm%fGzO+ZJh?`>)yXrg3FY`spY<&E{`&M){b~y!Dfe+q;r=8>Td1{`2 z^<41F$a0q|dUiYbJ*3-wiXwPd?#%sNYjmAET~DPFCgfhsjrij0hPIpl99H8v$(Q71 z%i)&chssXmEf5@DdwSI4ib3T^HghUjx~V<5@f*9AI_DW-beT^nFx239;pNj{^Fp)+ zOFX5EoTiRl_G@%6j&6z-%gommJ1kiXR={g|J*1(V#V5iq>`RFM*n=kz`5HMS7A{>W zwCZ|H&-3QoHSk|?74|5p%<7!>IG9%lvcB_vaT`C>lDRnKUbGGkxHp@^IqoQdiFkX$ zBdv~j0ha5Ls%mQSv4=8?oFz$LNft`FgOF}OTJ5`12(U;)soaqrl4&Bs=l(MAf1vz7 z@d2$4PRhx#QdK%N+xLL8<`O5M^(;s@k12941XxiDet*C@4}mR!S|46(U(3u?vM;ae z5i=kOrnfDH%eIyKt18hUzN#`sKM9OV<}LK(fEtRb6C+i{iT9ON-^KXxN7?68^#&XF zI+;V2!JOFq-Bhp5sVT0Ds_Z@X??BR68(7h1&+W~Gqy=n({gesT}`(mR)E*) z&H1-C^8y%9**W(&nzYgJ$;y1DvbM)U~YOr-t0H$ zZ(sw%%L_=Yq@A8qT7_yf4#(K7bQ}hXuVof3Nl??Ci?Qf9&j90qsv})Pd2tGxY-}#HB#m`_B`HELA1N zC;GB&GpLA)Qf72g6_4ujZ`X7?B7M^GZ`;^^Pf*Kt5BZ{r5(`kfZjKRVXmOe-yN7wC ztD1QJjrFW6xK2t#&eoWhg3usAFBnjZV=K}(zYfU)=7CGO;kP3W_u}|@3niAXb$mT6 zrNyppA!X2L7qKjUSYjLCtg~~Z0&d!J>J4Z&$#m|ew+V3ErWD5Zt^jQq4K{w0PnWBv zK}dkJRQ`m}8)}t2Gmrj|km%Mi>=JPS1#U*;b%_T4AEjGNXCrO^*5>f@o2Z=U=WKq^ zb@QkPDuP42gc1x6LJf!o(HYc3k^Q`d{QPzs3;QfkE7f!2+y#uT_RUhV%?WcXC_4`5 zsHIL){;DW8_vhZ*ltk|A6PZOD8I&ZCTBB0u%rzgwH@0b3TYi5H$Apjb=O|-^bAyZn zHJjBqTmvs1g-RC`m?(B1ppJ!+FifpKrB}}yWUbCAML#*}eoY*6N_0h;Uc_X;&a^Bs@*dI`)J4uA zH`>K#y?>@gMy4}Asj~e3Qhh4NVNIMn*Lkd}=lFvAk)g9W9JSmX=e#`ca5Bxeouu%H zhmL$WVJT*yCeEGZJi*guy-rOxo^08@=k9QDWV=m{A(!T1quSz`r%@}xQ`8hJ@(=h0 z>W16wl|401^-)&!%vR#)lko-p)Lr-K?w&{*g;Jlm-}WT1^H@IhP%Hall2t48;0L$Ri!2yDXPbxLH$BgN(UjFL@Gcjs?dOeD^3v0iWNK* zH2V)K0SIU7!rzAd57+qz{1!kNb|^ZYqI8?+3kc>gqEcIw^A+>ClgBL2qO3MA#i!2Sap-lfKwIlj0xb=OmU3pBxE4WiND`a!i9Z}vr zSniI#u~yl03wP3+JYLgaH$fpWIK~E2dzr`Y3fK0Ht5k#mw0`P3qhHg*aQW5RPgXR< z&I4+^vkOLSS#0vXlum(OA&W#B^Y6+6@n-_covHC@ec@jFi(DG&i^cZ{B~X`EPk6`1 z^ZEL++S91H z?|f4mi5`|a8|UHoWOinwXQKmYsp99hI*IkSg!*&3j!7-Aslwu>n?r*;-S{-MwB|mr z#CMEVVKD}p`I>ikrg0h%UhDNHwX#z1Oz@MSHoCQa*_Zq^0_qgNnt5??rN+9$dm)v< zBc(zA{UAiW$8N4&-m0&#v_odCiBE61luvE7K~eqIuU8E>O~NVo&dbSQ25=Em-b%zX zvG;NrB67i%UgOwzwuQ58<;zE)-q0s(6l%wtcYr}cca(Cnvf9xLsUk9-%Wt1&X=bZ{ zb@u**G)dg$$k69W`V?x8S$&`st*^d&eO#Z>nC<4hs-SB>u+Gc>@Z)2BGpEubK|+IhIhhmZQRe@u^prp0heO<5m(NlD{La%uCV(~ z&uGZeNiBanE}~lY;claM>qRd|RNhBCzAg%es4@SPWCk;`Pi!bTCrhAXmAJnHotyh< z5gx}7F0bA#M-)<4Q8_Up;2uZb&Q0^LWAlIJ?UD^PtD$R!#9Q^bM;FHVbCZQ)HDuH( z*P1Tfee(?4ykSjP9p4xn4xKC2fwi@$C0&-1YF-pw`c`)_hY zwSrCn!WSnqNlt%|_Dc!%i1#h4pfYt-mH|$e3+H0zUU8Cj_W`OwpSNjm$$?pR*UH;x zU*?S7Fv~NivC6n^!Z<5q=UvvPmu!PgI98{ZTTMLMva4o$bP6%bQp1~pl9QVuO!>CO zpV4mf?IUHSC;;I+Z70rm&B059_4^+c`ejef4C6SEzu0Tqrfwg;6Hq4?L2xq-kSKZh z<0-SW<;Q^%9Z_3X)UDzlBZQFsjU|U@#d#v1{a}NFw8s)BlbQB7^7a4NA^R^!|LF{{ zt!Da{K{vsgR%g^1u?xgsM3>}5vxQ_mo+5s1pBXGFibwU8BZJ+gt5?-hFW%Hoh5cy0 zU-+tP_>=87+OJs;5^hYCKcj)#q`LLS3T^fEt05_n2Uf0ehr(pqDJ1ux&U~?DX_zKOSf`j z^XG)l>dHuW;#Z^Jqypho1bWFNe_V9(nU?f80fIV{C}Ah0LH~2D6Z`AFNW!&WgOPJ0 zx8xr<*Zta!^uEn7x>^3UF~w>XGc_e>%jz`&Ze$T*Xo-l`(g68YtR5UAPu}B}9QQT4 z?<7q~zTq=C>gdvRUH0jwE{szzv!!`sCPF?aFy(vrulA12EYtDAFS^I=p={Nfub7{w zZTV|aNQOast$XM-j>xNK)P9dv{uCM;GtAd!6>l=#X;k@>7BN>XqZnsqP#RiVVjgb!^4sn$izvA)hs%n7yzYI_|{u0KYplp;MgpGQ1P2K)Yd21_K%KwEKv`= z)rz(s6n0PS+us_V+}P-t`PyyZpy-d=V){^e?sxHgI?oyD#xuQF=TCZ`uUVypG8KPc zc29Hg)4~^frjC}dB!wZPjV`9{$0xZ&i$mne#ys)Hx*dtpzjPI=T}2{1k6wMsWM45P zY26h^l=gD9@h%-TOTio2#4o=sU!wo^k_y2rYD1l>2!c~6UYUvIRW>T`yG1rRT4OAC zzG1DuK6jCJZ8dUdf2N*R{I!qgdOvi?z^1O^PEse{w=%+Fx(h>AN@^Y|)f-MK_Uko) zS#Y};PTD>tv~=b}F=eemof_)ualBoI?KWvwPb8G8nO7+bQAi%2f=Q5Z$W3I^Ui-7f zLE^8-#%jB9m5W%MEvli_g!;?Rzjgr-@m^o}e5{dt7a5A-=kqtQ@(`t_n*x?)K^j_o z8c|(Q3|4W}gs&EB^+ zS+z$!eqIJkk!cOGsur6}_U@u2Zo`vH2xvYI>LK<1$c>gH7dqDE46o9Av#HfIyD79M z&d|{Ls;oNt`k#q>3;%UkB944*~bFIs`@Bq94e-gk7w7*wtrS!XQyQvt15iF_?->MeZ{;EVdRZ0 zgY2OZ;z~Tn%HU;5Dufl1EL>$jOe+VXJGh) zUfT9svZT#3EZ7N-gwCTEeERXMbgHGueM3ava}TLC*n-NUX7+M(0|n;uB>=R!o7FZ! z<-}r0n(p{w-_VG|vq>!^R~+^#$V|8AaPa&thiclL?*GW*Ari*I?U(kf&s67zLn?DQ zl$QZ<1|{y|T_dEwZVvAH-2X|6{LH7oXvlC|9KEOZoCG)SO+Py%+*m`dPdB{prVr!H z6%0?irhIV`JvPSM$0|Fo<6++c78b4yNDqt#Q*czA2gS&J9va+1@U|Pd($EiMKO}Bw z(Byk}Lr+;(U5;y#! zqYI)=TxMP0e9U}(Bl|tL=s^0%_RL&JlV4W&@t;?I)5#Yv4u)MKQC}BVBQ~Q#80a?@ z=7S~H*xvg1 zbmWx%=Fj-KvL=#(r_6MqIdq0@IJom)uX@#}>K$Ri=rmM?b|Ov0CfQWV(zN#*@Zooo z;zoHyl8Q!K2MOdoT!ioX4+VpUZPxFjk+;QJSDcg@#S~bKeX3+b3BSF3WDoG1)7yvM zle_DoURY08Oy+CYdVnOjZT1wqB8^9{p}rxj;6)zbFwzYJGEIGNvxwF5_G|4gVVj|D zU&j=N3e8GOW~RG4yLby%uU~2eSBL1x?ayifqq@E^PLO|9JWo&mRrm4H-|Ev@8IYIX zoY<%)xJP=sbkU<{#)}PGF!3Y799Pd3AF_$ZmelK-vUoo}GQ9LODzZn^7D1w}tHk(SxWTjc5ozft%;W$-~bnR0y!#Iw8QYE(uhn)Elz*u0j@ z%y9wMMW&4{%o&5oWwO8FC9C!rSL@u|T-B;jVLH}k9Yq;ft@Rq8l$1fYRH@2+H$(O| zk6(IeV};5OISHhw(z`U8ueEQ`e$ypw#SheGS&z)GHHvC zADxNcUIZe?$Qc>h-vwLQ;@@~We38qiPJPBo#&HAJ_tdGSvJLv>cx!N{7oWS|c(-tkSe-!-onK2T54|kL#5C=eI8Z&?Qv8Xs zBTt4WNA5R~JVP22wB=UB63F=FNVyHn`M$os*>IVpHW0U=Hd3X}Q_NsH372_zym1y% zO*Q3PyoQ`LJ_Ki}stxqe=%vxz$tahmn6o@8uMWO530J61PkUOg*f`E^<*paU@1gKh z2B44vDY2c)T0E97t!b~@o~2x>TyrrZ$Ps!Fp50o`xlHVCVdvfeUNyBm%Y`s@Qj{^Y ztywc2a>#}RE>&&=nTqAQsAA*FxFkbM7@Y&~8j;{W-HNXmo#bKBo?D8~<@(e>QOqmj zwHmoG*P)uB5ZK`HGEtSif|bMplr4N~w^2 zV;O>288T|{*isW}rAI#|->HPC>mf?rm=dnL>7sJ zyZ$-2u*uhYORwe&RhlNr?qVrsX z_iEC>fHtCFwd$Y&;-x!M2-6c$Df$7zex36 zLXrJj9M~}t$8y&i5~WdK+~s~zS-i(Hmsu6{Yf1Gz3^Ein` zcA2b}=EucC94DLn`o6xsBkirS?1vpJ)zeF5#TRMedSq#c;)1O;HK9C_{Zm@^ymc0e zVkDdll}l4)f6538+7|uqOlyeTL9zHF%oNo4qD%QONjxfV-zq`PWvp7QTYBN;$3gdN z0hwwQ>ag#RAgvn7=c;()hpyFQOXmBE7E`Vdj;JUrzq1Lx#pgEPO-sv4`Y|;)Ji#fy zza8ymIJ$r#t~Jf6(KPM=-@dUSIAhhF?0q{l#hYbse7qpr*dLv3n)d9rpv}T|9S1Cu z1>n;UF7j-7>&IgsnWq*ge#>#Pq&V*oh4lQ`SGp*J|U5Mb(jshv54K;tOGA;Ui|b9b^q|#_eY1zi`edcZAErUl}ao$*z{cFH?Don zAbk;dW9asexr*|_TLxakB_=Ii#YHCd>O&<)ST@}HMsR2yfZQf<1(?jX9e4eG5P$zB zh&-?At&*?(7L>rn#Fs!vif3bd2198r#92UI6#n7N%txtf8hOC{4)G=2^!hF6L;irj z0?E5-tx?PI-#j&FHC`?UhJ9&LwwwJon+NN+egNY+yBg>Ec1uq|8-0MjsgEqJus2JhxCC(Px>Cn^tJg- z3SzViv>%n!PHW~vKa;cE7d6R05?pP6k1A7BAjg-fUF*5+wPja^9+%-{DHio;z`-;euHeul61XUh!ah-6fx+pQ*hi2-s zbCwGq@GE0{ASI|sc5PYIEVm5#*4TUG7Vbw6@^Xh>QOuL(H_BToCUe>ZoX~*#xeyR`Z=`bDK%RuT-c9snGIkiy9Q` z)MW)yi*9MqosJS!m%r-hXKiWrxO3!qxijfGzkd1)ciTy&_86(oF?2G*rGtTVRQi9h z_nu)*b?e&btEh+w*in#T1C=VhM?^rSDgx3$kQSPB2oMnk6-AULy$FOJdJ7O0>4X3Q z0wEzPB|r#~mH;8iH$8j3d#!Knb)Em`T>D>sXviFMjAuOME*Q#m!vdr)>F0lo_#OiR zsm8X|Lb)cut4@p8I^43_0LJ#UHO+j$ikpPolJ)MumAhdz%KJWk{CIIUEmAYewa5m` zD7xP%C~xy_zD4vmlua+M_Zpv>s?%~Ichd5$fimOz7QAJurES_5e3dVF=~QrOt1Xs6 z3?ua}-tX*8mDh3k_8mLF!!M^LuGtE@s!R+NlH|HB>-Zz_i>$GX+gC_kcHUM47S=cH zbg50EjWQ9tJ{91b%@uiUOsq4g1KD8# zZYC+0-fMib8T#kAEjsJZ91kz+uzKNvDCx1gtg_1@xBa^o&QU#|_VkBK>kb$+1uoLOXT~N6Z-{sb|cd9qi&C{c?outKC1!#mh#CuIvazLJ-PqT$^ zdnd!7Er-` zcys#wW-&z>7`WZ(*!Hih!LFC*p4&Vk zvb59OhWv4f^mu9E>wiP|;*!6_8413*e5LQnrS7{wy=dqxuj?HVxcs6imTXP=c+7bC0hrCjee*JHfPRPm^-Lj&!A-jnY^0zquG zaN-loG5W+gjS{5o)150bf%VF20(q&SV-v&H5Z(AQDZse$wz`XLTGz%NV8(n&z|S@4 z!1t^J{?=d}l)v?uwt5Hf^K&rw zOYcu6u9J#~w?2ZbR6qlC2S(>8!wzt0IbZ%{OCC;CT-#Sr!oyonT~7|+?iwRr zU`k7xie3}5QBOo{|MFbN55JA(c#Ko&PT5qy1(y*fj@%HID;^*71V*X;lTI}}dbKjD zR!1_)cjVX~vXV|LA*54p`p~kPP$JcGt0Seb97(v5KxUGe)87L;mEHpi04jAw`I_0z zTfm6c=WLVr68u5_J;fHUx#pOaBYdlv3xDnvld9Zo!HT8mzyo)r_-%iKN`dPM=8=8K zU3ZO^`M9^@vZUjN|?iaHpG z#DRv0t}X^rf9@!lWrD`@T$%w4wGg$lr95){R>NXv-#M6N>akFNYha^qCc_a~xl+Nl-2Rc=CBp zz>pP7htt>%sKvD=T+v|zrA0OV^ViXaOn8NznNMp?^uyodYTOzn=`HJMbGaw|hM1$P z5>&0_7Ho5Ks{(l9(RFi;dwX<=@_p&C6@p4$>&E$!J)GxZ0C=Onmp?XigPv zgE^EQK^d=kAX@rtgZ2HSiJ!gt%(QOsDt@UAZcg_12(pwXwX@?6DQQBsQpOn|41Xqg zdAOqiFq^?{I)&uP?{Tgov3m)*B%+23;HlK)visI*sIA|1n5T(a5=3Tws3H`^5iY3X zKqCWt9l61{YufR0*~;OAD(5s^+v;WjCs|3IoUrSDfl^|Wy@R$J zND48@EF-&Thx4)M$bk9a4RyiFR6Ap>jc_(F#V|P&QEiGxmkZMaXCGC1o+dFaPTaK8 zpUGAWDt3Q0uhfG@Gs6}bzq0DkfqEKwM)E7aR2wz37&=}i??bhFK zdhe{K6pPe|3vCR@ARprDeSRK2AltXMZ;sqW3@7eW6MbgyFmT4`+x}fCo2GlDA-n8I zFJet6gMc|l>n%;Qx7JzpfTY#su>7bVHNU#%cSwhHk18oPhqIY{Li8d7D81v7!tZiR z`aM|ri#+mgUYD6>BwY<2LS6M=z9v2$uQM}E4i5Waugc!zK$>XxgwfmiT=3hL?fXt_ zs_(LfD5wz2#V?oDu8weuM0r&?SM9C!9O<#ZYNGHPbttCK=p3zDpz(sZtI^&L$zee~ zJhnxj7}{X4m4lUIPb`&8?6#jV0MN@Q>z2}=(NL3}&(SXj|8WL+_w5rm1rsmYIf_ffgh>SPG%@OwJ|^DCngcb=)qg1EA9DJY}94ak4xkd%ECu#g5rC?3GuT=_aZy z+le@NE;8talKQmBUwU{^Ztg?80-pO{C}&IkQhiV~5xYcyq{<`&oVV8kvo&L_HLI8-Pk*5ChzxH z4|OwAbmGJM%8B$N)}pmtjsl=!on!oK8i1R7G@FYpH|l{92Fj({Hcc$)!o* zy4QDql=Cs29nu#GGVI=%4~-2Z@Z|1jNtWffu>5YADivR6bW8)YnX80X|320?`<;i} zmcH;V_D-bmz+vM+mc&AxAB}bYBo&&6i0D`}aNByM=GG)Krsz20XcB+u_B$VsG(KA*JnG&9Qr~)1b>J(tQIPD=TYME)9X0fuJmBMjQu#0%|rMK~DrU|aY*|N2+ z{PGRdqfMyV(vX~dQ2$t)pFK*>J7=MyV1vMxA862hY2`9u6fkjDUP9F-9Xpo%@a|oM zlrfi$j0}J$VOYn5d8E~F`u&afTXZ4`xjjCOM((gL$UXb z+f$AfD|v?`#f7h~eIKdW*aq-KU(-UnP5tZAgpV1R4-b0Y3Q@;`OT)T~ z!sbYZn$J@h)n^=EdTt#J5}a!l^a zlgK%->XnKBOl{-2x;n;^k#7#}HIzktV(NlZG;k7|@&z=&H@jj(z1Sl7wUX$!Pcff*223o=~u^z~%=s(0}I7JIQTk)-T{7kc`KzS|TdRV#O3DAcNw_H%~n zQO|{@0FtyvsKH5U-SFJdbm2xMrM1 z?H9#!BMRiR2{(Oyy|{lLoEOfy(LMr(KV34PvGtaQDSm(cMrfvFgx?{8Qdu0C;_(!m z-oh?f)jgKp2SCqHt$Y>Q7gc!UuQ7N-1%HnG-eeTOb z%#d@T7vIVB?K<=YiP&XN+Qyq z_$SVf+PTLmuWIn{`n1oxqHl3zkz(H;7yOUd*J%!(cOUdx3KQ8Gqn=^y#6TS$9F=gc31BU*H++Qc46hOG3Zhhw7lnbQc4 z=*4jD3$K~!e%KMBRg>U;o|XEkmZ-Rvc^r7T&pGlIxDbadUk%^w;jAp3S2~R)LV1n{ zJv-5~sELJ8Wvl>2;|`d1v@M_fk1x-e9K4H912+jasF0*-nZiR>xXXB<2btS2Q~qn-X{qj zwjU!qmD(=3x3Dt==e{KwKec?fWDY*=NkN3ZZ{7v)W%qiF`C_wUCge)&$VW;oD&KhQ z4^5y~pJ^;mbY|{C=XM2s=?m_aJQVe7CGKns96IF;Ptn3)&UM`*{K3UraexSNhRevV zbsac%iB(_x&=hn(xbmf%*kD*0I~u3DrU8Yj(h2nF@LdTCE=uujyqCuocm}{I?-@ zwv^tkcl$ihz(zq&CY$THIi4x7cda@@Uh>o8rCX|IEcHQrSOhz zSwGEek2qyD0(qp$pBaQ*oK7rYzH9IyjFev}&gH7CbYUj|)t#?$I+i$-;b3G9=ga~USVuj4JlR#t z>v;khY7XdjiYDjtE6kV}r7QHb(1ZR+R_jAxfZH=2SqQRs|FJdq>}vt@V(S$d4ppYH zfJRB~$y!8DlY^q^nB$04XB^KFub~R4%J7H>fhEQy?zFZ~43A}G_@t}OnyXIG_5ZRf zW?~e5M*HnhVee>mZtToLqUNrh-anWU(K=?L)>rk<^0OhvqWn-ZSYu-FTuzedkVv)IhUSfWAdRSqZORPI0q$~lRPH&9JrDR7Nl2wznWobL z?7%OD_RP#SFh=0{$f2fc9VyK=J2TVHIkg}-edwN!L1f~)hkHM7*T;?BVN{c*Bbz)Z z51`Oz!M(+(?wIGdLZG{- zk`lRLl|g~#?HtJXk&JY5A3DN0;b^GZXYxL%X))0T2L-Opg>S1GbaSXlcxHz2bR&~I zIGPdFlfHnrUIDO9e!F8_3&i)MLvn0BZ@sdwsnc0aR(0xG8Lq40G-}yUe6X>aJG#?O z{t)x`WzBF|z!FUfmYmDJ?A;zhY(fE#suRI8b+nmu3QB&xWL8 z*B`NWx~lfUkPfsG6wbl15{C`X^sMYJCyThRQluu?dW@nms5t%v1+kjxn|g625P1(zrqc@IbpN#Qu@l6~-eR%+wN7 zAz5;_eBxIC_@ev91zbIuLQ)OIOPA16!Hy>eIsy??K>eSz3Ipuls zkMK*+2|xH1#-eq$BQZhLXI2r;pg9JID!Y?dfS%ziZ9f%QvWvy9C|XV!uafP}r>#(+ ztG7+Bx>C_ZeQV&-gdpxv2^(+5dUEU_)Oa+%3To;i#el>BM|;-Y@%{+AQujj_e1zbK zq1gLXD9$MytBn^rw*0EfI$m+20Ck$;n#>}`Jfb_p-Qp~F8EVU2Z@~@Nr^M;#tb`-w zKV9k{PZP&$U)TGF!yweBdgE^!Q8vEqfCfZlzg3q=1aOzNe&f%D9=owP26}}L);DkivA*=CdqjN) zJTN(hM;7XEZ?&vP(8be*O7Q)vOpUe;n&5F0gU;aru<&-%lkUyCe_*(`Z5{Y0IV9WE zp{dHp;*d%n^^8KsTHGj*n(Z~jff#e`iBR7_=-;?LmHGpF`C0ZtPPTj08_~9VM(vue z;>iO8vc@I~uxR}4leSygs=BF_HnU@if+JADg)nfHP}Jdox%Sdz`k zP3gK32HtxmZZGc(DysRYXW41=MpNhOypA$_z)*iVGm*+Sx8nB&DLHz>%US)|uxTSZ zDJC2Bc!_Z*lhA@Z*?Rv^EFk?F!bb7K+m_YbM}?FM!Hc>zg!ixG`p2Eo`piZmadK+$$}i zQr3X_o|^Zrq|C!6eVH72x_4Ls@upkD9q3(3bVM>@TI`ssd|6;V6iMW;I4nlzkl zwY)^`oe#L0Mwr!8Ei&Zy5YZq;vOgQjf9{%Mu55$P?1(&+Bh>i56s$t(2~(!VGr@7X zH5%v1u`EBA#l(FDMs5x67+pk6lu-Udkv;qg>PC}@%f`jTOxd-d5#FVSZ7BkH6Nytq ztUMbPern2jcUTJ{ClM^-IU@WZhE^BJ2*x}OFRQx)%_R)&jH8Iu8DX=!F$&w5F!5)xWt;9KT^ixt8bWXvrg^NF>Z%h& zSa?z2t%`^RapNpWoTX!Myi(`5wTJb}KD)s0u0k3Y%5{NIFH<_}?MfwPEV6eX(+9R)eQ?8C4rZ%l)d{ADaFPD{}tZ{@~oF;ptDV=UzyA zcUJu6rNEc|ht1}2MaO&R1t`%%Jtz8^{7zXpPQfuZ)Dr{X55fH?o7zdPd9mPTkmttu ziZE8w!q|agTo&XI>@7;kT&f+A7xu3WI1e?-0jN&l_#4jR0O}vE0&~RvuxkEo7S?Q| z7q_RaXz?qOWyK}_c4RH?8R_WNf}fl*9@ zd!n*;|F&VLtlRwAsJ0v6D*2C9RT(K_94obAz8Jy0=-syRxL|hFR z_3`wCitA3#ASI_ZWx|%`gW9KXFB&6u{AU7(Gu`)D))URy9eZDm>;bm1!$3tq{2$c<`%_R;C`xR@o{} z$yxS0H!DZ-PS!BMi2kFSYlVvUo&upz?bS=#g;L#^cKue7#XYUXW?EZe;r^kUM-Lvk ztXfAQQXcK<*3q9Jo1kp{_RTB+{T)E*a-uR7#VKE|;HYI#{jk%$OHV1_xAPlnPd}FS zZAa)Cb!Q#&4=$m=x3W&lu-##1;_o+-^s=h}n5Oc6I8(K)x_{@!7TS|NbQ?G@oN?OP z;IWfWF8mDzNPY%-i}0EYCGCN{iO)@?heAHylpe|(2`2H)*Q3Ry2!^tS1IFratY_CF z++_;;tXa71k8lq#7t)@Tk~cK1dop0*Hp+9D@ML#)2^Rldi04t}RO;0aH|{;1#~7dX zelGBEkMFm&M6YJ|T8{{zz_sgNj52I^y=1=S^E()xo1Y@VN>0d@(_@b_4RbSYgcmhE z_#y}uUk^SeP#xary7T_H)ZyyRmxFqk@uZqg8R)w&Kv1Lzl&32$4IcekRdg0C1am~e|MyF z?}848y%fN((ZqSwAHT;`Obh@l^V+pSp;gJ(%|}&xDp z3s|%*X(4YY&Z&LM@V9miS~@-%sEFtZ3SMS7fn=8p()4(fxTRIlO%~gQhZF@S-D@&m zEN}jB%SkFNhO0`|Xq*N2<};&COFkN&>SldNx;a$!vxs?jT!|gPXdl&@SCBk4XBh!;N)Jhhw4~?!D-(6h7uR64iI{G{i;UuE%G83A4h(NT6xbs0|-RE4RZK zlk_2X8k)GnsY;ycs6i<;;d!`Or+RyacTMc$ zV3mBQZYq*}0jKfMKr)8w4{TCExn){?wTs^}DId+-8<_lvZv8lNi?i@gTL$p9R!`jE zTw%?6goZQUg@lrP-w&3PUFYSgd`hn9jEkowgqJ{t%9Rbr8_-HkR4w1=FlSC@H3xkY zX|n}cNJ=8zTH+xm-^hc{dO^M~jMXPG5P7d&%zaMoY7m_zMjwf?)G_Wh+~z3G`%BS2 zMs3naLGe?L^Q{6vsDfeAmrld}b@a&G3U$yTL@_CtUVj9i#)`hpHvN?f3}ajQ5a|9# z&s}(a#AJ{>PX;rGp2lnbh*3vJHDvCP_kh%9H!k*qj)R}l`zLW1_zwe|4t2 z#Zvn!>E3q|AiSWJV1^-0NNd?xFaT&Yg|4Up!;^?J4_X6DB`M;<5{R#lite4x zzHb7yk1Dl&+EtXEV*nt!(E}8ds;>vli$Xf5JB`OReJnVW4o`nb|LN;v*`ol$aAvyC zV;$1&ZKQJQMQ-AN~nYSU2{!nujI^<`6RuKA0nbZ>f z7IYhEQei`Lpcdb_80QPx(JL2_m`J{XGzY2R;Cw|n1s86C#hc*r`nK|HOTnupChhi- zyM5|ZNk3YVqP||o?~1H2S3S^Sn(FdR5d!2zlurR61Y*Nx*dam;fLcxsxF8IF(v(A% zOT`DkN!`04$CWgl7c$p3zvRzED2GNsSddXtjd=SGJk#1AmgWCZS!h!aObQBHJnr^E z7>ddWvR5f;a2V5gFjCwiaHqL}p>Y1w-mb)hA%*dTkP#w9AkBWBVv)TW5%Wf7m0W|gfJLoN!Z#{1Y*YNVhh;B z+o1S_SZ3mq?2ifq#4suVuR?KI<@bH#va;Mbz*rC3h5Oc4O zpODLt3o52#qe9X(%kqXWTdN+}DX?@I-@VB25W1dPP!q7p}Po+dcN8mGTNnTE1gURKEJ6wOmEvO81G zZ#ddfzT}XX1!#j++#v96IZ}oq812bYry5YTnC%-}0z89E=EquL5-^`Mts5NM8~dP7*=HKqo(F{W78rSv-Z}eT^P;|p z-QCTQ6*R~aXee`rqFjQ6q*Qt4lzi|mo_&h+)o9j8Q3%|}{})$}+j&Q}iO?f$4&{)* zC*Iao`E7O*)2jjZl`+&a-nCxJ80>7&jr<&@Z)%kw1u?{&jjn<<_+L^i#m@g-Yv0j` zu6Xfub^LgL%L!G;mBfK`;)S{fUdfukDXN_BjQTnSn75J30NlpXcwM ziGT#coNjKfkfL-NXO*VufI(V|wxfn8uwgbY%vT}QLzx{*8d3tr?(Z@l>&9o089E(| z)ws6@C(w5yC3iAam&9;}zrE^AC{*&aFOq)iSV#z~qa-lOm_rpIqCi*C=38Htqbu5z za>xC?X-3s!2LZ&Dh0aMH6MRAbqM{`>DC0L}vc*hm+cDpLa^Xzmow2yCyvOwDQ}y_4 z7~fBJhJd0qL(kyPlp-_Fk`c<{47PJ%&_|;>>fKdJ6!QyCBcKwMLZ2hsPD@yfO}i9v zar+?JUn&#kqaoQh37N-#cl%5%O0Uvy%Z!M{e|UqmNUh=@cqY!{+j^l;>`@_;6D0z` zA>Inh4_Te6Om7tG^*Bp9#4jM11HQ#86>o?VYlhOC4Y?*NKUJ*ST`SGX`$di(RP-e@`Q|FfJ5@2xjWIp8A2fKLRxN&TWoHA9yv5qi z8;HqRVz-CCQ}7zQ%@5H9Q#~lAJfBkGkCwJd7pi2P@CN?f=TZoFNs6gN^N<)|gb)nC zjwtF{$Ig6gAvq&GdDMiqZyK12lK2`4-sAS*21KOda-@`H)mu7YmdzY`lLk2oH7(!R zVyrwg!vtXg42V>I#4|TEZ!g zdVN23&90)kjVP~h^>v6Sj8v=$ph2P@Syb*$YmJvs<+-J!l(J*N-uvlJlDHwC=AYI} zBb5es-W{|9!2s*edvBIrfa;aZBrl0C*UUa;O>v2DPLAA@oX+MN>lVw3ekw~Yx zU2xGBJE>Y~Rk|-@;;8?CI5)}Q{>f@ayihNXh|-{^Eb3>lMN6VtG3X) z!;gLKLpFTJ#dD)p?eu|{&S-n=ZBG??q5Ka@iQh1H#ALlwcW)^yTUsrnO#PWog}6_g z|7qz8>9lvDS0;?C&;adu?Z)9#!vgzsV%vX=eZrXf{Mx>M0R?jAnhWePLcJ;52KhF z$zwe*ZU?n~fKPsQHKO`?b{=@Q>KT$pg@$g3NQ`d&=C=o^x#H^a4HhvI71scG-01R! zjeu}gF!4!E?8yt_$7G#CCUULhRd@=;j5E$Z00xUiTB1tc{s>z;q>rKS?#?hPH)=cX zWc>EuS^#U}R?hqJfZb$2z-U|8qwcY@$w%+y85so#^iE~Zaq>($a%!2u-tvKS7VLAC zGy&j%j*RK+2~YtIG|}8=H$$=qcWJC`e_pNH??5Sb-+cz>+Z}nsw0hN;1GUPWkSa1F zb0}`_4ajFU>W_?T{Uy`(`+2p|3P4YOfiW#d&zc;HwYE+&hq_685*yI&>KFosoI#GU zeMzvm@tmOdpCb)td@=~j)Ti~e(_^e~=ZW*@0CY2zg&>nd9yOHl_qGdB`!>}Lq3o@Q z&5)}l3Z9{#6+HYi&qEB|oA$4^TJ6|1aHwkb|GWXMI`Buay&p1aK zT2MR$V5rX~u5VnoLu~o$u`nHBdY?F*n!XG4wxBGgZLLhKu~lRrVY*oPOhTnHF1;yM znmoar)fh{Wu{7?_DAp6t4SaA%-ZT{n za$|q}b{oV72I_Bk^J=Cvywap>^b*QKlOJj<_m+Itca59k-6v*zc3xx5%?-rKP{N^q zDDnt|IhmN&^~B5zC>#}02>leGCQumEO3$e_+u-!yjXNM^jW7p?6=je$mrE{X;ob`MZ#JSsasCuoeGi&QKLcBl^+IcA0InaHHp5Q=?=%#5}Ac4qIGZi{$> z1SYF)7`b699b}fo7B&0#R?mB@v1IPIh1R2Z)1S~@ji(=s4j&PSgzGYc?P5?ZDi`#;GxW6o@L#ZYw z1O-g|Q_8OQHo$f}nYY*R2;5H?tFBq(cz(!VV9?{WVxrCVfXV1q!`g$5!MZ0uvZb=U zvngPgO|#Q*t+_U#jYH9Y?Tf4)`=HwpYgJz$l;Z#)NX=aLMQ2`!6S1Gk)JmR_-2El7 z6aiHxeXO-6%fW>jy&2eZFK)drcgmRIhhlJdqHXPSC3*&Iq5<=;t|bv8#&W#H%0AIR z$74dGFHYF~sBD^1V%JzD;~y^iO`A)gPwh8w)MFkikckhmmc6_zmHp zjJ3Z+z@l{28&F~AfXuzq7~7yikH+Oxyl3t5YOdu0+kF)7wUHSUmFzhph9*67{9cSF zzXxo!U4%?kG{^iP#n4IJW2YuGEehI}8$9d2{y(jn`9|;6j}sxvpb`^@OfN9TTMEZE z@63ersXFX$IhLRkb&IhAd4j)8B8u@O>%SL}PBE;U$}2F^&QwI7-FlQpK8(jbOgmw9 z6MR_7dj=zr zNnoH{DI4DwR)_J;p*bms%tZLs?f9aS0m5?_hI3X>DDolWBj&z{qGa~Q!d&7)zyW{G zS-XMufLewp=JTT4udmW{H4a<%o3MPwP&OiqHEDnL1`ZrtN_L$P$*xKw#%q28Y*H(W zp2QCyhioADu>Wm+`~8o2kno!wM-kRvD4w}m|0M^l8@)CJB*=H4@3B{P&uCXBTfN0$ zu~|?oF89Ik;a0UHpLt)ImOZ@77UNRa44gbXB0A)NYeLunRF5$bBQJ}!KF}o>gcBTU zS-N=u_qD_3k1ovKh8h{wvOZ^qeqmP~8vww&x%LRcDtYj+vY@a@rNP6e7wL1NQ?+5` zvy-q8`j-#ybebHG{5KKv@0Ev<85|1xTOxL~?+g!2WXN$G(h_`NCOuk&$ChT}r?wk) zs!Gc=3(6oAoEMzjnaz>;yOn&oUn1JJ0AISDLjsy}$v~~eQ@W2o@PH7i1ilI@ zdRARlaRqydYhg4xsBj4AbR+^Y0<#L3O7~q{YyVNdrwJ`HIz@(`wp#)4a8FAX0K_iT zL+ATDJ2&$R)z8Q9fl>ke5DOp;y{4uz;1rh<90fB0SU_$rxaDz~WB>&Jy;|AgUlbEX zeE}-!dUyKgf088r<eT_R8jbG@rvD5i|MCfVxO4ye zaR1z_e?I;1oBNjy^7m2r|MRwd#x)mQtbX+F#ia$iR@SkQ)bvs_k8_w-Nhv9m6*}E_ zB7lXKG?6RM&~+s!xMeHURn?`085!M8Nv?l**GLIodhKJIj4q&B9!!e_G}f~$|D!ax zXrjoUK+|crAn>1P_<*7L{+5^p3%`s1VfFX#Xp1fZGJ$=bfb{rAr&~PuKPlTEK6VFJ z9hN!ml!Xbhb^Igg?C<*YyVl%gjMm%(0$>{_2bcXC%Rgl|X{t?=_bgY1p#^GOmUxqmyu zwSd1ynoxs|UuM-T|3F(8v?uThA2A}KzHNQ%(*(*y0>CD~5JKUVeD7@}eIt|B7?`}} z8o6rS@!`{-{(bj<0mMb>WY@{lR12?EF?7_5U5Ao^w>|k`seQ}y6$9fGnN*+T3%)E# zb$YQ1`Mh~!v*ey5uP$u|CV{)CciK%($>m1z2h}WbzGh8e$Bqnv6n@7{b;{x`zr9%{zD$K zNJx=w>BR!0^D-Lqe%Bs}hJS1Ml`FJf1h{HD+{?&<+_F-oeqXQk#%k^CvZoMyve(`y z@Xm@j{-t{(&+*LZfT4W{_US&9b^J^I>YF=>qS}|su0B3+Dmm}@k*lw`29L`x_$_3e zK4p6R;M#I|5iY~kHFz?6i6T7HK?)96vtWC=QfVd!ofpnfuD857N0&+Kk{Q4gSs$g8 zD}0s%g{JBk1Rkgw;C9n^JfNw*B_dy&RtZkdd=}>RyrmBjxg@CzS72FYGGM2;5gGSc<1e}-)$}q%aLgS# zXf$%qD{P@%63#;)({Q6uqo^BS6K(VwKsSd3nFSCD z!uzSaI3;N=HGDTbilvjm6E)bL5^pkTZY|Q566x?tjzFl(=dpb*7%owC(BFZzhX_2& z{21Z%Jm+^oC9i({G}<`l_zW!H1Tvd<0frnS)})3_sL?Wf7z3RNwb5yi+$BXDD}}N1 zku&=q^c=ANIe%B)!rIr&q^hA1>7di~bK%^CRX~GdKywatDe{%A79~6R*nPeUh&?7a zH(7RTt~{6LR@GN=>IG}8vj~G4u2(;0dns4k5^HaI~!D^Nk9*HW6kTI=FbSe6%#I41s=m+D)$c zhQz}DoU7-C+`e&Y=jymWq#=?wF_m*_yg-Rdx-NdUSL{_9d9KnN_jk+`&oNJxws+S#-D3$ zGo!NVdb?y)Mca$;xbUQGF@~ZIlLR5o4&*B9aI&ncOA5DppCxemKoFxBfG2 z3GyrLUC_TqEkI{z8>k?=kO@cZzd1y)4HAUc=lt_cVzNCAm_o|Q?c|B%RzW6z@C$AQ zzx7Oi`i8@SOhn`4{dzC~zR;?ywdr*4FM04Qk4U#~O@5}c#uF9};W9!!#x|OSjnTAG zYJxJ}hbsi8$!xVM=AN}hIH1Q!!5F>ctMt!NRfkhGRG;CNMt0tkB&@7_n!Q!#e+8Xs7|5ylu3!h zH0WW~Xn0)UR>jxZyIae>-;im&b5`tZ7=QCzvgTYfv#A=p&Y>Ezc81~O+IkD_K_ziE zw=&l;wA#3r?c?>Z^j9u|8!fwY48Y`lGb9Eb9;$@@P0|y0Hx1DA?GJD`5M8F#8DM$d z2{9by>T22E{kCQs2`5c4sLmZSBqhR76`1Zpsm(9}wfk*D9{YCl{oC954wT4Oip!4J z3|oTI!L3>yXAkK7M0kJ;X8G_Bj5XW`@(v~m*Y&;?Z?tS;x8~4%TH>=N{K!87dGr%H z_WJTpr;#5B@OmmJq~kwFd)3Yed~Inha4r;@1iMzF_`DPnOQ9n=Upw;MR<7t%+O570 zoWjf2f4r86sTmz=V2H#+_Rg+7orf27%+|2Hig~j=v`*aspvfQ;?uD4tC$7 zvxtgjHnmHnZ$a7Pe}#lo^=NIs<#$O-`_yu5;|EyW{Dis}paB5^PrH`+&s0Mzl-rb) z0LxRh*uW!6ZEipYL;s%g`tP~>KPvNRmp?1~Ip^ZFqQ+#zc>TmE*ZI8(eHJR{%dX(y zS!<)LNL=s{xVa_}ul+gP%rpy?nC@ z7-Q2GLJEi{?KTm4CvPtTuQ^Qy=|wzgbL`*ivCFrB{OI`jDentGz%0KZkT#@m^w-bU zUo8*ZZ*ENHb*@z8B^iqPmvZU(+Xen$bMcQkNGERC2)=}GZQBs1p0?wI`P+81vm1pG z>u=jB7w#wbrF212r+RnhH#x-F_zPx4-q!fmn)P}{iBHHtyv}=D>6P>B?>+uo?bH^X zd)^mFY4e|$N@)Ye1bG!@%$uQyt?ZZb&nMh{_UeDHMO9C*ep3oDAJio+(X1DTSNA%a zkka&yy_Cpu!c#a10z#~E`s2DR#kYQ^`H3=SUOBI*h3|Icd2Tbc}JLjg5*>PbvhF=L%POT(DBuhS{e} zXWd(*tBTB;=f{kS84m4F2<&gzQ6D%YOup9BF<_Y2)l1zsGa;zBk`y>{IX_HLrt#H~z4bL@WHO&F29B(;18ErBWviaUV>SDO`cCyW zsC(J8PpI@h(UaeAA>D#?LQb1`0|9Y!r+xkTF-_^S4Q zm!LQ0fMogOeUpO{MIL*XG4^|Miv=YoRkrIQS_R{JR{Sg9)IUjT^c&T+8A_S>Rfh94 zccH71=TD6_L&#vZIHp{TtD8sgD$~>&7tLaZP;Dr3qzyXU7CNaNjjTv1!pT-|f@d{9cy`#JDN#Oz)CcvszM#v~{YujHYdwB@^Be zWnX>u@T09y`+$F*?f#kM4ex(zi5xL%40^2caBrCeDxCV!vl7L83Qh~JMJp)=l#wDh z{ncj4Kd$*s)vh#A4#{<3w6$CC{rlw&C>aYa<)6?+Hs6vo4HfLl=?Zog1R%=GC{^w( zoV^5uk6+!JK-Sht$KS5X#mrN;TsBE0-EWKY0`t&!Q-}d99|Y*i&klGH$hc#0-#G)Ho#_ zx(Um?dDjM833#{BJ=|SS1y$BR7tBaeZx!;gA+&hkPw69|+g*WNWPrM+lj|RMcYvc2 z5Ui#iZxd17;5fH6%=s09jkKhMEbZl1?%EN3KvUTI$7AQTePu~65euonqJ};bx7`W! zlgS>;BfdsV?T$`-6qxXMRuVsB;$~&nRj)DDcQWwA!6w@%oc-uyB5K8EYohw0c)nk} zgue7v7WL+8JA5G>jmK174L)%kDmE2@+I}T2mHFznO%SiFe5sOblI07KGOqtV`Ej^ZOWOe^nR%E<&dq1HcBl6L=J>bj$0kE zr)ZV`hrRa>YI5tsM~{dF6+56HMHCQ_pcIiF3!+p30U-ob1Vnl$p+`hSrAqH0(n~-} zAcUeIy%TC6AQEaQ(n}!R%{lsg=ir(7-8=V>J9FpzlgZ0l)?Rzy03H4 z`PNh^l-iYuivAprstbFM((6`w@vygXd>mFOd^*VPGkR6{d{w|A)h?Al$7=V)TkmDm zwNhnw!iT(WlNWl{`0`aL(Vb&;VHy7@h;n`AtfETDkdCV za!m(h7I|CzWBJOfgQUms{bKFoZSQ;4X%*Y_=)+~^P; zQg8%OYkFAFVlvc1y!J@bkWt^~O)RbGu$dPuYLa@?*r91r*#~E*c-m-TE*dyihIU8F zTMYF-1z%YkUn4VH`w0{I?PH`-kv}?9g_h!wo5~Jwa^lPfdkbxyqI>`u4QNch48qlN zUy&~fW~?dWTTd(dv{H;B*>k5HP&V*LB1UgYe8?ka5Qf`>WLwN@5_8MYR1 zEq`rCFzPAv$8QbKR?nV`ReQMi8T`=b_-ysB?)RTbXeeUGUTbLY6Pz4RSq^-C!d(%9 z)SyQd;3g;Oi^2+f)~q&#iwq2Snl}bo)F*3h+EN@u1cF6;7fr^RxYBIKDLL{{SG&ru z7-nKespWnahXq$khW9zv#WhoE9$aX!gvFzy}hYK##~N`D=fcuZ8?Vb_z^&~(0{A~B4XGl z5Nh9i#*C#iElS8(cWv#RYmNX7suSIVg1qn2&b(as{6TQW2dy`g4dXIm6;x_C-3RSc zTbIZ4CN6RlypXX|nW;(%UMr*e>XY_Y7r-ae1g!_S`C21hE5FyMt$ zYNNv(u4^?&rFrjxM!q8;s$IDl> zqlfcjjJS~#cBG^Hop4cC`hTG{7Xdb}{kkm^ZNud&sNo@pO5aIAx6qSKre@fgX3|j} zwu0oHGt8)5hUd3bIJ98rpPg;RXdAeGtOh0LeWtbR%FO1|#5cXvMf=za{nO_G7UMQ2 zNSxCNi~S~n9ZQ@5@Dcv1G{61Rj+9UAOk8-=oc-H}?+6f(unGS~O#4rx^aA<{yx@r^ zw*3DL8-JSpgQT@1ziLeXc%Uh+X~bpr?s8@S`t$ZB@Nws_741%` z{`t?~(^_}E-OoS&UwvBbyw;Gbte}5&qS9~g6zKUmg(W+OP)i_Xor%?Okjw3G(_TZ-xM}DTdu0iXW>x=aO=}<1*-!Z8@`Wc4-Rlf-@oT| znbSk>ygl~XKlBCYo)-Yf@cWuQ(B=yCQIJSk1#&j6zW-a9D-T4|MnG(k|0iM_cB5{s z8mzB)uVbDTis?zd=1RKz`(mqn-iL_pM4u1k(^Nnn?0*7yteHj{cWAuLjF~5%Pe=6bdjuJlPJx%vd=MR7% zfUY8-@8-{gr=eqRGWkK#ZIycLyDzH*OUO_onvr?3PL7MUiUJIGuKJ~uyA?tlTsHdR z^vEsnG(B-I2(yRY2QRG5?#uqEH?Mc}=5g}$A7Ik zbZ2_q<)ExpT10(DPH9*e6p|C8cVy>96W)N2c$X&R^b-X5?g6;8k3o?me0qaldyEoWLb~COM`vdV}Mmq<J)Q+!yAl( z`kXoCD-5A+0E6cK9>o939U_3`+;^|9z|UnwW2u?p&jBD!pL z|2lF~-E^S%!!&Mg&$8c_OPEOJVAgqJKCh!?q; zIL(!9*E{rgh0c%MncqtP92GBS6}N z;nPh3Mw3JT8lC6`rlayFSq|qYb7(t`^bVe%f~t6W_FLlMH4%@v`a6>9&v&FEk$_`H z7gN=%{qD0m9szheZq2C4v$a3iSeemjI6FT`B(;s@Sr6ab>0~(Pwxq`EHPibkx|CW2 z>zGO!NwytdR9|7BM9Z@|>FuX4ACMXA(l&q`n69w;B#X$3&(WTv3Ym2;Hip_n(fM8@ zq+#?1ta7E+Nx}}>H7r&aHRj6Qu!em<;$Q5Kkw4ehVcC{jcFWuLWvqegd}xfT0t^i18$ zvt7!%1=od)46atROUR%{>lg58`tqJ=R{q0@mZ5! z=JYS8Z=3>#H?1=&w=E|gA*slIjCBQ5o3!L{&rG$m?R=;ooTqJg`q6JoP~G_ffHzjN zgS7#pPWz5G(B<0~Z_+|z&PfaVr8UE2NmA=D?kq_workO6_G--hvB7)b^nA4Y7UVro zoGU?QxD3zJ_?pG?{#R9&ZF!d=rSI0=eXQm;T$Uy{Ygzj_sb2n0bc%;bVV89{4~RW` z9{(iT0uw}6aQDEC|#D37pq;bfY)7NG!Ke3TJ+WfKrjLo74 zzZD_5%7m?QHMZ|_4E7_fh1K>hgOQt-SdXn4|0A+3(nZ;6ZfKttA*Z_^gWgIMbWM`# zxki^;k@2m|W@r=Ko##67q9f6!)=RPLgXRy-Zb`mx7*;-}Op(T$dF6b_{=6jlG5+3+ zrF-3Z`mn`zo!cf+b2UKE&+p74Cn%O={b0 zL$dNlVz#+x+9nv@`8005WnvX!wpeE7;CKpOBIG8v_GA2ktPAr>`QsYy2RZcD(s(zB z(hUW!FqfH59dnZ=$A>aoOSbLf4tvra&JR|*9Q==p?rD~sgRQ{`(TM@troCfwm0D`ftjAzOEBLF2O0qBQ2U?O5G@QM0Iex0R5p zqh_2wj9Za5N5qkSGEDTxK{FbnCxlK1WrDLsIDs}dxwnRYS*g1zFZ^$80ix{&hVWxy zCH6%vjkhL-yvis`;eO4R`w+VBVm0At*^Robv)gMu zTgd{8B1oFN>)RTAZ2< ziB|d}xv}@E*xhjmQ;Oa#*jv*d4|E+zWUW$WE0ROi1murYG<0fj*hJa|c`Y_?M_?^$ zFl~bYmPCoSEkP4;W zb>|L$5hCU7X@uWgCEJt~Sh~Hmo9Z3h&miD0qgEi91?iK?UmdWG*Rx-?b{W8q$1%_f zO0-vAFs}5{3$JB!gNod)w{O?c?2pCQv!O=WMjxx_^D)YteaeMnRC03KIf2)Zg{bWNkHsyK2hy8J1xQpI`Y#|J;~YDv5ES?-XwcY+aR;V z_nf;u_LeyPh=jweCClEWGeeWsbFYW9mc4>sN>eIAKkYDnV3pmH`_R1SX^SuR4e2I*jZ=%NQFdm> zGoHUmv;UxokzEiyjki_`PdDaP-eS56M`Mj|x9K)m9^5)8+pnS8a#{50vY^ds=OkjL z@WM=r^`#Mi+u?WaHQEMlg`YKG%+C)?Y75S;+2t2(^jOqdfF+*YCf&ziKkrrM=6}?!$Au(WUrN0)lLYc+Q&2Vo^GN4_w z4MqX;$63Y9Icqo5VZ@enYHf;(R(3wH`xnl9hmr~VKJHYRF`8R|9n$-S>t*1^+$S;r z6`pSXHJSO+F@jrfpTiY+{|2uulc3A}XaCHE7Kt)@tY3 zB~&8&L-ZRy@asNL!l8K~d`F#^g}jKQQh{gyyORHz$CUx~T*Ka&JJVhH(OcnM(s#%T zp6}m_4TPwd0!&N+%O{AgRu5mMS&zRuGP;v{l(l8rGP3FJ(Nb+eyF8hmyDN?{Hf zaOiL5wiBRZ+R}1t^s?s;6dw)2tPltYCC`8#i5_3)YvZ4YnH|51Ac+p&>L~Alc#hjo zoTPo?*?f^lIqF={O0N>jRv(vD{B^AY#b=H-!@m9KA-dT6)%JUPAYshh*s#Qn*tYw+ zRcDG`<$SPDF#I@aVl>%-YBsq!Jzk0Iw#})qjF`rbTYfQ7xYbzBbPRJoZnlTfS90b- zN3zC{S?C)xJd+o{cdUXw+y?UFZP^}A{{*UVUn>pT!f;)~ zEqrw~M&&y`V>xp6+O^we&JRbvt;RSb$prp2sR@rr8mugnKv0ceKtWH(klaYk;2FIl zDSleSX#0rXUm4BsfgCPEmyXOLJO1i?pk%}w0e&RBj{pt2YdsG%>d~Jko9km1wXtudI zKyYBsdMq2ZI_Qv3u9;x}C;$LwQ;rnxPp@THm7 zt0zHyrQyk_*ebJl_xQ>6FE1PpoRe4z3gKvie=N}6cB%q^B-O@r#gRMoqd|%refHb6 zFZWg4BL}x0X>i0(3}Xs|*gk$pbeObLOnED@NtyV>f3gm1Mu7{@;gIiG8yjcvLTrOs zNuncng;lEJTxMq-l1m4#KldGQr#!_e!&;y5Gqc(%$nuxGf?X&0jmbx2W<1->$9zp2 zo8LK&$0GNAFs$%#xhH%|Z!B-^v84`dY3*^MgL3B;fzq|dQLo>h;`XJZfgrOmoSl}n z=uzWhmShzDOiSjFw_T%C3JUvITf8gC2cbIqP(r5gyu+l~{K|eMh<5y~gTq zf8-}-ckA8F$o@Lu7*erK^*-0VR6%#T@^LiowSmDfg)$_`I-<5$SN27>+1jY;Y8kH; zM^8rA*&Ba|KCOeA_9m3`JO7v}YU=XyIzr0pLOP*Z*WuLxl7Mrez0CH9uVr<7+l?Zl zL!g!PaO=|QCl%|UfNJ=n*LZwg?P&3@*|1;lCrEwJlk>J|xW~a%b*$^q>96WekSQ?he-+$0v+S%9`(*qKU{m;qQExc?4&JJ-%-7UlA4rQd-^9z^j zrmi^jY^}Bi^1lu%*pFuv0pp3XB)LXKHxJnB(1^zt+<=iM7dCAJQe7dNxwBNttgfY$ zjP@Ce8+bxNO*myamvqU(^@KnM($~W>4j7#i~iN2~O zn2_xxQraLAr`ync(`qyK2UaH_*;R)4!9C*IXQjZzk$_~_X1Bud)!|Jusf{|f8)C}a z67Eo!2-8uKHs29I4DNv~p%})j$JbA;4n$&PmZI2Q*WO>gB5)mapEJ^a4T!EkwsEYu zb5OlDO)_(4($p#kShRgz_Fc=jw179(m%O*>DZ_!(ve#sV>}|*6aqan10Kqk*zWwF# z1cN7j&_HZTc%saX_bEqsdiiqs=(=?3cE9a|#Sx3%oFVyG*1p2qon{mthoLTXb_u{! z>NzbHyY72Ni^!<|t2PUrKODjp;&bavs^~3{|7+#((90v|=q2a80mkQ{XOv02n|>T> z*r?r7cUTSwh*c<8pzU&k0Iz&N ziN4_3%aAO*>=e7p5;Y_ja{XCf1Ak5_A5#RxdYDT?@uIX!trPx_JK?#ZL%NE%C4F<< zx=_rsh)#?}y~)kSEP?KU2;1aXmO)h0r|g%|_G6gMkV@)nkW0^%aiM(XX@1fR* zFChJ_UyQ|Pjog~L{=VdyHvZNz3(}m5PW%-c^)}W4H@3~zrzK$~yi9i&YuxVGg%7z& zHGkk8GMjmlwVdIzUDnuHsS;p@(r4D$d?=RovqWUAbo7m!4HiwkKgvtQe{bw}T7f(iE>2=VSp6=Or=CCH$3AKK|wi&#Z zHesVd0B!WnCB89Jc11ho1s~qtF6)vQE`BIk;ebTXkDKAvcb9uWw{JXzxxKBm4049V>m~6*^+!74P2oHzI2y$7v1I z=y3~qkD73Hwc!{6c-gDg`CIQgbm`Z>qz|2JhhKm}g$-+}5PgAs26Ic>i28R7#t5o$=v` ztsn8{UCklOp^cX_C*xWfK9p9Bmv1ic<5|o7%3_8Vy5U2pu6h#{sdN(ZIR=V0Y4!2E zDyVJu^7OVlRl*}C=NHneS};)Y5>qN*D+HyJzIer-nRWJXXbbA#45#>`Z$@7dMpb35 z3QshUsMi+)1TBcio(t`J(1#u_x%k{H#oJh=$TO2d9NCC~e3GC>z&2;|EMbrwcQKrv zr$+}mdeUi22qWw{R%B|c+pUNVdrM`XU|MFqs4BaaCEd!t4Iz5HrpKwI3{hSXL(Mp} z!+vxTCGkh%N>GFX3TevhHSX4od10R}=cEVqp)J}4?T%ErJ}=TgqYW>>nU~BTA^H_S zAR=E9qfOTe@VW=`ElUiwmPErL&XAaPGXR!a|MJlwb(YzE%e!%^b&Yv2d}iy-u=ZR3 zo-q`6VPlE^`65oml)O~j>!GODxsEvUD*C=h%y!@9?9lja$uv%|QOY~cnh?g^Ti3_E zahu+)Tfk8y^^WNFHv{}w1xpV5CGVUf&N<@tSjY-d=e-%?^3VFoR~QHE5>wF?6)r%i zy5+=|ZAXhprem0=Uf+*saGS9gqs^DuKt+^XO({t3w(mLGoNjDq4w-qGstC41zt^VC z;DDngm3@2o#iYD2ci*QJ{tpm>@&l8gW+NS!nLnz&;d`?6+Fj z*_5c0<6d8ENR7~;I=XA54!$q!H|hZd`=j9|{S>dV>6*4<717V0X{%V-YxSQ}m9oSd zf;5hHf5#oz^^L|Q7w&u6x-1*f>fMEhmrlrI3eJCu{-RdPflp8m2NSY2TTHb(2t1>= z=lo5 z;|E0(QgCZs^_D`7U*omGco|QX`-wz5dtOD3)q0-zsP2mK-o+}9hmd9X;E*kK-H#alw3)tp%T`#Tbo7C-N~{t8X{-!5&NX1!L?sv(=8TQCws6lt zB-IpA+r_{6n2y9(dZMyagGxqj;^?*2aE$Dtb`!n~B zB-~D{x>9P*e`EUzvwPw7jiiKXLx{%!JL+;sUrxEP;9{SN0j+TNl-uTZJAV5^=WK4t zGsOxCn1yK%a^NwA<5eL`*w&fr&+cAvi1cR}t0`Q>iBf7QWcNSPiErjmkBqOFkz1@?|(bu8LS(R&d`FhfpQ`?HeyXZ(cBmny`Pm5YOBPg0S0wvPon z$h8!#!PD%+w94WkRM9+p24sbIhf_#u0Sq(~kl zbtL5eRZsN@z5V&v=%&2C#+lSn&cH=89w#y=EN14HhF;Hrwpgv(e5O*~VMH1+Ybf&) zh=ucJEOLm*S9HI3{!cfzZqOi)W9szqYec)?Z^yR-uAzcFzr8rZPwl-; z#MvJ$kt$)d9ma3UzR54_Za;ey1&Gx8Y;%Yj`}-!MN)ispS_BHyWVk{G1OG49{hBVRgS9v8jr*x*~}{^F|J z#?$n|EUqL}Icycj`}_}KhbH=t)Ycb|n$mCVr5MM)`5fQ89Air$FvbvqS_>m=SLrII zlrV&o^@R=iFdLUytjk)iP#JP$e6l{0yW9G46x+vqdNZbGJ0JGkIOpg5lh*pUZh zc6&l3>#XF`1RlMbIA(XJAMVh{JK>M+-)c?TF6(i#Z0`#=aP%A}m^L1| z++&~$DNCv#jus_$SWZdMDV8w4(Pbx`ywBvuhFT$kbIl9XHz*my74B%e`XyY|_T?#? zVd!i|rngVa(X2)g244gPLqGT`Y7O4f2$<~(8z?TbFAqC6@aHSOL|V+3&Xv1R1W*iT>m1iYZ|IG|Agl9@6ROWDk-WJZjVb+U%!2Uc5$()T#!aJtoa*mW@q0=V~o2 ze4~Go*N>KO<0{ziCHotYC>rd-I@iWD*zel`T>J1>lug95Pe*ZUZufTg?JabPhY+GB zsFajmZMV5&x6zauzp@*cUd}?JAeG}E1ndiv-$5kkUO0H*xnNMEV|719CQXd%<(TM| z`Z8C0ta*v-TN0Qk>X%HP*L$nbrJehaQ}@{=EC}}(9DB(eE9yYbCimU~R(+G43~OB} zrTY3aD-Fol#L!>bB(I$hlbP$p@ia(~vre5$B$7q++U4Rks!sGQD9XYJ#GYnOvWjjy zbT%crrY}r!@?{RF%_-SkLBaF<&Mt$h0$~rS5S9cPsU=!hmFw>B57vSD%E;o}6KG^IJa< z_`EBlZ*@wxv6YXvQ$CmX(=;%Hx zA$uFpkt#X=LmOI52e1>_ceJvkXc7Elnh)g3>?T9hD?>6GGxR->iF~5eSXhWGjlFNW zr*e_djDA7gt7q}<8(1mIwC#<+6t85}>nb zhhMA1AvZ3j>z5^2p)fBR;sS@gU%Se)*}FEde~F}Cu?s&V?Hr>N;h5@{i89AX;`};^ z4rV%=t52NpA*wiEQxMbI-FLA#K?>9J+=FyY>FJ2m-o8>X8uoU@&Z6rn&aJzzgEoA- zPEoLePi#m^rnmreolsS9eTj)aro@5F;7FFCSMSz!5n#EAZG)26GIJ_ErJ|p4jF%Wq zeLYJs>N1G2Damb-wfy>~UC4BS=%C@KrBl&mWI8fw>NX|41?K3wgdILH;9g;tWT`RK zpqWujY%F7YUII0fCY7vt5>1{nkSayCqf8=EU3e{L!pslsxPC!C3$8?=2hj=gEl?F$ zy}j_rz7q6jT|tS*uQBRfTA74wO_)*%7aTf?;$C)VW;8vV6R#YRajN{;s$5a=SzV$F z{j~ifR8OVSUWIH8dMcnv=ZSn)1GlYUDTrQZ0Wd51}`*IluN__T_ za1HA4A#XeO&;f*dTh=&W`h%U?o~N)cbobBo4t;w5eX10Uw$tx-J7Di7hiWy2X29+2 zrS8C&#G@loX?@!-w#@tNghDBE@sC%r?2+zs8^)9F+SoeVrx>O8`!=F5zj3wkPypNm>JIRqGc@3_Z09fU-8v}77r7GXH!j$AG5+XwM^MbTUq=zO7+M&yU2-)C;Gw$%W#T5V_b%V z>$P4m$~tAB#6hQfh#uV)(ZA!Dw|T@cA7OPalzMcNV&~&NXg_dGY|rhIR`Ze{y>La4 z2_MjJD-0(-h=Zb~D#n+_3{YFyXFulRw)}AmUIvAkn+&&dK1B=f1H`r+*VdYhqP|^p zCF%{HsvAxGdiAeEg5&;sfPY{}H=w$lstX;u@=5!RP@wHyLg55Aexbph*S>#Q6NZ>B z9$Ddb6#wGiJUVwc$4tBaZIS9BUF|hWVQ8yqYGD{CsWc7gp`k78MZ8iIZVk$%V$3T8 z;*$``%#UV;BMxNt>TIPVnHfUri0Qf_`pXNHO388uXhxCeaRh8^^#}^9M%dwiC2@P- zSFh=(QgN=i%CM4Wt6H(8BQE$URT#fz#TF)SRo{ishFJTd29j)@bKmwW&$xB?_3Y&6 zFr)DCmhrQVow+RxXrg%RZL$i}jCy~X+TJ35$1aGkgkd^_pfDb1ij4X+#dm_rj1LEQheA`q}M(_pv2M@0ccdB`%zWNLi>gY%UKDk zr~)wlG2*sk4cSG+6TXIH=#M!Ytg=K`F?%VTQVoG~`KYjdl1#K&^(gwohsQ4XWh4^M zcMYFtc-Wr>3A^&i12r%&5b*w5N@m9E{9&%1IXDL3geLK=m(HSc#=YR95r+PUhH47b zU9?+ZD^BG8qSRPFC#+}Fe)`~eXXh|i$_!H7e!0tNMEP1+ERyiWziweBfb^AB;cu`V$@iV#M+3e4qgk zl;heqta>LrVor6+78LqKQnmN)VU-m)r-TJfS5xeUU;ujl%pu*6H3W5>L-wd{`BO>R zcW%rNCv97<3S+c{#PqDn?2`c`s3 zgiiO4%>0_?r_6Xeqm}~YDn@$vk}##MX_7(To7q^z$|h03vZVXgWTgoGeVKKVhEDD` zG0CwZZte*kBCX82et}}Xd&*dAyj4|^?wGJ(+BL<~wR>BV7_M4h0sAxZ;UwEzWluZ;hZmLr^nO8yjDfJ&D3DxJa{uJc* z9o%(z)FqfW@Y}|;PMc^x<@-&bCfv2rLvB>7Qea?Y+rU+$IOhUC*un{cbjwgpKMh|Cq|mX$%;nBnr3*3%JJ) z$=GC>7iz{Tc{46MupUt3fwd0_Ci`*eFdn4A=B3#j{TadE1{g1!`(15VWq$efzBOA9dN{Go7n9AsDvL5tXDC|KuJn3)}IRN_+9f&kE)uxP)HPqlF& zd-e+Eul5AGfQmpK;dv%Ql9WwFn##tvns64|#W%j&SMGO@1AJZPx$$4np$EWlsoi55 z12|MK8|AM6%zRQ!`I7)iSm5&Q{qOx7+Z%fh&%%M02fbaBkP<)X{u z*76%pg&7^>#wPq95VeqXls zJ?I|af+@f%t16?tegb8^05YEc)pNU^i-A5Z5)MetKp%MMMKrW%KuE2|w@lOwYtMlK z{Zb}HN*#%Yx*#ztr|^DR$CBBt44}(4c>DP`{2b`x%xW%m%GEx%J?s$^e77Z2#dX9O z+N?DNf}n;E-q#u&?yAk<@0r;hQG-A4OndKeGiZV4cwMM=;NnlraY7rApBE!!dYO)N zh|EIHJXKd+;(Su0xM#>wv4Gr*o1+RoJCQ2jJk?FSgCRPw;A8W=P9v_Y-@M^QU1v(^ zYJRj{r3B5RZjkHCDbrlpO-DXUINeoew5VPKT%-L$WZ$^U^~cwMB90Eauou89;f+eH zEY{wvm~acspo0JP@42JK?^SAoxiUj`FtdURK7UH+a|1x^hfnMB06^Ln|LPG?1#I^=_}R_i{LM^&d}iM>72`0t$;KL7`ts~;)*R2^4N%YxPu8f>W= z;{5Jb15O6uuY^d>i2;8_(i8!?yVC=cnDp~d{7>7$8jw->orP{XQjoTZ6F(UAGmGoWz3`vNI|2%^3eh|G(-!#fQkTx4f)Yo#m;&TCEOruj|M!UT zEn`}Q6OVGsKJXnH+99WRJ#&x23y`e7J1F6yw=i|tii*zXXex&ad!p7ykPNXdoUpyJ!^)g*e%V6`cg$#((jC|GD;fIzS314LDVt1tPr{ zYRr(8&X{kYooAi79tIRkKXx?xE0D=Y(#_pVewz=NKwjja)g6v-WCuwv zaHpkH?%r;s{{P?9Yy-$lLHW1Ognp(oSI516kny0tY*h3-P$#Y34rEI%x@Ww1-hFa`Pt0$Qjy)H`npT~$#s)@bpU8hUfBYCF$`BJ)2MrdQxEe` zpZ(`8IOb_KkXWj+B^8#8;7ZrS<~>M%Ld7W<=~#qnPP^#Va^;5s9oDgO5-5C)*xodJ ziA5=&F`>btl%T0MVwy)t2I)_!A8T`e>mY)P&@dN7Ry55Fkub5o^rL)=MyKjD(Mexo z*3F2sZ&IWNxGKQctuHH)y3BtVS6+96KX>0WqrnDQM1AF1cz;P`_YSN+|A?jDbj_H0 zTTFn&7tMgPyeYm=Ows~I0zro4aP=@+b8UZIah_t@5SNAJ_9~F6%ul(3zR_kPWsGZtqW9-+Bq^4cUTFrfb0qIh&5&8-- zYqkEwr6Y9I=^#lfEK1*F{4(9h=Ba~YuJqlzRrk#uj>1~z?C*(c0pB6u486qjgRRjU zLFan#o$r4(=wBuf`u^bY8ispv5SJq~*zXytar^(dUVm;^jxiv(t2rF+{>Jh7pZna` z13y-4#!J!fmLK>QXcI7YPxNn`{xz=V?>jr8c&BS3Q^tvTw;=^rc|`2==9Rv@#P)Bu zwE;N{25q+mkzMlo^UtfmruaDRQy1v(uL zezfW0QT6+k0!2NIkj1KICZK!;*twl3SB z-H!iwp(i`t*HsE{OYW{8B*|>789FUC7m+}nCPZ0`_+Vwg5ZQ-l6i{aa^TSY~pk#Bk z7c)eqG=Lt7{d2^ITgPNMw=b{PmJ?llnn6R2g9C2b46=&gX*24&_hWbD@du3!=z{c7 zRDSSCyx~-xfL`%^0&?P_s?>ZZ0*o&h+d%YZk33x^IuugMw^k(kklW5*Y?xMO1jY+x zc^q^2K@VK=xd+>UkNS=^-st$l>}9A>_36^Sq9@xmtPX-uumm+});IiVx|(z*@K zf@Q}&^gh=g`psecx-)@+n?db;^(94))Kk~b^=uLsHgH|xbwF{u zrDTbmEq4Ajd1j+;rsWhMEeo&lJNBN=I7S?vq5@`X+RZ%fS+4b-tGGZIEtFd23_N^Y z=QpRyBLXx5S0{1u<(&atXO?9aiA!aU(3a{!t06a1oTnWKPG+ovYb5YAbFs_peqIwhfn_VRqy_vUUjy_CBtr}8_($S(eHU< zq4u%Hje}hon!#nORIBM?Hl~%Zd%<&g<1vnv^N8E|DG1|!hm|r14Y$>q9-}Tz?ZUan zo%he`s#N*y1JeEg8~G44pkDwKo!x#6%NuvRuJV*$pYTK)HH-Ef93(gF05146`4qtu zH8A98CVfXWmFttIaqzvxRnctR8mY=fbNv|cTadGx2FTup0Uu~f(890Y(f=yhlZ!x~ zKQ^SLC5CVX!tzM$eTgc>ggT2BDY#uq7ib0UwUCIOIw8+yXrj~gIh)vLaxY+(iME!! z?lO~KG0~JUJX$`fp`nWp9oMHtJcj=Zd4?R=v6^=DU%yd@p(=X|lp0SoN7Wbh=$Rq| zDn_qO_Mq-tPt4+G_>`kWf(%fxJYcyWmIFNSqj;5xgj14hjlj-|2!HZl5qs-^>N*SK z*G9+Wm1O~SQhZGMJ&gGZ1?sy$^nSbC!2^iC2K@Aol*HgG#iIoB>qbrO@TS*O7%u}! z_t|oKy<(}g| zStn}cp5$9@b6dgGD%u)1V26L$FWoitsSzTnnCj0;s=GjCF>4vhAuqFtgtf|0qv@{UgB{Gh?|68!cU-*Z|fC79=O6oUj z0HVT9V1U$oY-RuLuA#awpq9yKceY=Z$N#Dpu*o|wlva&p|ChUdRuF)46sc>=9@|Yt zuoF8S2QQ@8`F-Hu0?|jwptuQ3&y4rpO^NWQw*X!U^4w!JA(sw$=*gwos_tINg&oo% z_S&?Zn?M4NO|#=PSON>0H9tu0-0n+{*IoQkrFwW8kaH;AoF7!-V4B2bOX0-i0!bo$TT~4rCWMr(T`hEvNfY;4)KiH`V{$?axDhm)uJFKz{`P4(fw3 zW97A3ZKid|?};CwL&Z?bV1j6pda}aV07H2xpt0X|1mB0egF;RkTkfJFdjTB;zb~jT zPl6;g=cs=V$ZvnwWdH5H9(v$1MCiM58$d^x6@FJi?q8{iIOc$sJMs7}z1&G~*OEcf zY#xjV-JJ)4qQPZYh3duYG+4)O#f!H_2}u_7Iyciw(KL_%zWMnU=BlGqm8+a{*i6Hi|{FWgzkxPu6qU zTvN;2a_CPnANlQszX!~}B4Xw(pxoUdSJ?o!^r6s)@x;5jI#){zMW5gkt=Fc-x+A85{274p>e)aH^<2$BzV| zCttgqu*RlL=L7kbFAY)vrW-E1PXK;(A0n7rRkUL1j!w?oQ#B3UupZttR;FENGdd&dUeHO%O$v>bj%44Zk8)i1- z=O;K-Qh+;8g0YLhU)Xacm=S7SL6Yj;m?g$do|Duxf0ot(rnr&-P38h+92BFo7)dY zSJH^DM2zv)0;C3M0n(*wOLAU=3A^QTEE+ z48rf}vhH4D3csR~3G8tn`|V#1CbiI6(3%$nAi^l@_yz!qkA4kSDe8w6$=r~zH;+ds znR*Q5KJKYsa$(OM_dVktI$hYq#ygG^vjr1Knqe`IhNi9~PFb>yILziXX>}T# z^fuBIw$w}ETJDu^`jq)pB4lRwvT_Crg!sVDq>@0@m-_9*Pg7XD4-BM80 zb@?fF*9f9^7<9Joqb}hd%e9~Q^nz7u7QhL_=LA@0ru!+gv79XC_wh5|cMY0Ic(bqa z!vN?$>PwxmZU1AP*wmCEoqor^xW-prU+DcKIdu@MB)PB80fr^_s;~Nw0S@e_RNAL( zo>&iiQk_{|cc0(Kn!1@HRZOi?oL#1Q`MR-AfClcp))u5 zvCG~tmRfp~RX7%f`0-^q$)X=`*e=v^?^K=m+o$EAke@%epgtAK8%XZNdY7&cSh|&Q z)z4RZl^U^^i78Dp zXaSaPfV*lGD;jXDD$E1D`z1vy07X51mmJ(*SLt1W4-F28iId)jz zY|^~)!abnqX@|G6wqR`v^7NfeF?Qs^{_cKev#j$Lgcv^1$K(A#=>KBx&BLMY`$zGT z>`Nt7l95CS-O0X9Nh(=N_F3*K?x0(B#=bY>J&+lC4>i)~!%zQrY_iNu@)b-Jh_M2Z{S>8uwgXo*3zG|N5@boLz z|4vZ-`b$zD7+g28V7uV29!WT8rfKj4(^+m}2&Q(Ps>B|FAE`QVxs3(?$V5K|!?uwM(i;PzBEG?d%3{s=48G#5SA7M$h=5lWypL(&Y z=Y85Bk!x93#qC7g77#dUs_PpzQe?`j? zixSVtExd$#e94#b0cQHZfmMES&IO31Yo3I%0x1tj9Q-0GjGm(I{cDWpe@}D*qYkf` z?`2?_ZQBh%?MD5DpI~4hlaw@E8`N&Z9l`zsJr)3vx2l%{6~S)Dh@%sJAdjDY;xU6H zxpxm#_Kn*daR$q0^zV7-`(#asaXDO3jkj=ka#5_bQ1#JhjgZh$z2 z?>=^zc$Dt-bV3dWWa?jxsxT7uIVs>#=Xux6f!YnX@61+_P?<9^+E*A|=y_lysy$&w z0gf#Av1oh~z~mxAn9)>zM=KHPR>gaR5}~qN_fa~KxVO#k-ZQ?_2N3?D^Gv3o{LJk3 z`tef$CP&c!uBZDi(0!+s2u&x>Re};B%hPADVo|z=c2}-3zEcg92=R&`a{zjBiv##y zLuKGEV5|&5VdO2~BE4H_BMktDO8U*)X&{Z?7fK%gOLrquNV^Z5WiOY9YQ{=3xypPtc^_=VRzn*)5oU7+>Z7wKXP?C)H zZE15Hekzfx3%|FYodJCHdwLKns44$UXBhnEDWmmP8}3nE&ci1UM_KM7ojA&mvHQ-V z&F~vvPPWl8z1S{6Fmbg+%;hg8bn&3Q7(Gz+*x5$kynwv|jxpy*QbR5i`b6Jbwtr*o zZw#Gu+m6IlH5G2$hsxx5rAY%m=8nX3tnYQ}dHT1pofdU({<30o^Jdzklqb&( zf%CabwJZy`?w;q==}&(>h=~ck?n@{vgUZC|pD+}*lf=$?)%ScpH*xu{R%S=Wc5k~LKx_p45s;ixf7ZHy8NX& zlx6Ae2^Jw{L8)Bj(+07}@~_8pj5K>Yd^_TDzCN0L^Z<*?h`Ze`(?kwSf~(O`f2Vjh zrE%a(Q1)xOO9{k(?5yq2eCBxk<@A2!e6xO0YV!B;aGl{#*2Fq&KPJ7N33}$D=uak%p zCNYhQs11YG2Fs(ciDPJ=-Cvm8529Cy|TTe237eIzfB5gjwGJ^p2#+0%h!PT z;IW|M)Un^_!Mff*-UPkQ&c-$x3yl^&{BK(SFZe+j8HT?(Q6<=4v!2US0k;n z3RA~5$yx5xdlk$X6zN!|MRmz?^E#dgicqIICk=G zo!h`t&Cm~!F2m?Symy7uAHwViQ<;BvX6m7)Nc?8O`w<~ES)eDax6Gm(!J3ukvlMcp zCdV{3Klww(;wfyS+G=EYDf?*Hguj#=;P#4cvUetFxJORuG){MTEo_ax1) zHMW{{M<)fit_^Dj-@euFjKop4$n|A4D~aw+>2YC?9zAj&d+iV+*IpiIR_(X)ZC^D% zA7A2pi*C?JFc&59B`Sq38N8L%4c0|CAz#rcy5=gUq^>ud^O+iw}qZ(s)nK_<$7;C zjo+Pk)qdA5OzXYEPLoyv%)sWDA}4+gn;-K0`SS-CQ02qT1(T>+fXBhQ%ShOM+*WT< zvY^-8U`Kx*mD1Cwrm~4QtvYc6UXxpk+H@b14cgrn*jH3%5WG?JpgWG!?&r#IZNL?u zuOeGRXZpdF`%7JT+k-z*U;hO=!Kz7~X$*^_c11*N#EP88dRBUeOC&74bRYD^tKZtX zt%$zpgC`I26a8yhm$B5@@Ik>KvIdDLJ2z0NxY^W^w7+JfE1!g2(KzUh3!DGMTcwCg zVLMSxCmtapNV8Aoxp$VH8#P@9RR8)~Y)=KSX7+pO@wQPGY(=u#F2w6EhAGx4SFL)w z<(kB7{{cpW_TynJK4s+%t>hNF>nj)?^^97zj_`2J8PTDqZa!9;FDqwEYdO3t$<_9K zD{npLHsi~}@YF4QPPcHI_v&oFAdz|x&npPuYB@ok z<2AOp(2Gw>{PE+IEf>3w%LxveQqDaEq5&g9c#hz$W>Zp``t)l9PJ$U>T751s*k?i4 zx*Nax#+2$=P9A9E5Tq`~4Rz)F2Cn5(H|~_o1}6mht!-d4Wa8Bm=D0M(SDOqpGF4U= zxk|mOmIj8v3-jUi29)XWp^4N;RBX%1LN0Ot{C+&eYiJ=jz{^u$0KYY$Q%|Z14stVE z(NK@_|HMgE3s@5i#^Wiq@U_i(%i5KA8$dQgD{ej>YeT%jo%mG|O%=_T$V|b1%d=mq z_e2#m_veZ3a!%Qd`zk;NB)0A8RoI8wnq|cc61}Nea_yJyi%@=6QPjWH%s0q}N@x;r zmon6%r?6kV#LVgpk-U?z9e#$;I$UQYVsyF zGTU(aPGs;6Dp%pD&*T{gjqlVp*eI=w`AaItsNv@q}9-;eW~uy(DM6>0PK!zWU#leU+yKbER%)L30GWO-bTjUSxv zo5$!-&PY1d^h&#SSqdj@yp#y7-Hf1iz-2V62zkML*6Z2WW$X%=bFiI<*KfX_JY7p2 zaN|~QSaoru#?OzHRaN(mr||l^`;hwwJMnl{dTvode){QLN>OXQxdI0}2>vL_~7<)sIS2~8zEbqk|uPBI~2T{oGx>{uHv zp3;Z*a42sD>mwmrvQhq%@an@=(*tvfHBPhRlO#;ez;{qg@S7xlD6>mSDMH@$?k+x@ zB=B~h4qG0CCxMGZ&WH!EEY1U%<*Q&8o%516Nx`HY6{IS%Tip(k`N|>|1R<`iY9u4* z?P}FH#k_pU4Yw=F_yNymMOR+1`oUn_ovji=$K`hFC*C?z4QXq>US!LkT7#$-&cJ)4 z%3L+@zI`3k(*a}28vSI)wM0DHjh~IOK~+*u2-=XYPn<)LC=07h=p0nVaol8^_jIsB z2Dyq`$`*wU7hpi zdHPIPocg`@_IKy=N}1%oFSRQ3_Xd*Qx<8o78LXsE-fX0pBbL_N_B-HYaGSA;3B9ZD zG=puFNCrti@>2qSOik7XRZC8JCZ2#5rYbIzvCEE;La4zhp{SiQ>&T~)8v3}wM+4suleTt z87et;b=C&+qKkwrWI^~Lkkf5*`&R)>jF{#OFU3KLx*4o`>&4>jwD!QZPQHuNfa_-} z7Ee?TP76^tV%#GvaaCpeGVn%u0Tz=InhW0x>}UJjBk>gm)UOqbHhTzK;(qz+U_)IPUJH@#V4@5kFue>`U@0>LB;iOu*2^i#Y^RGxnLVYTcargiV)` zNlOtmX){eifVXa~h(ghzbJjlAv2(E?iljwcLo*Lns#Hy0^yVhK_OOnCgJPyN{{W0w zF6XGm*6a4LOikP40n^;ez{cGjG}~#E(@+5=zHvfv^9FxT<*Cr=A88A6mXyVwkUg`t z7+2dTbZT?VZBTl%UPtq)bn;fYM;*3?lE38=c_OL6uTgbS6r>OuQmSS=NJRCnQlOvO z$}(5u=e&-ic z^j6rxYyvDA&LCA&9}LM-7Sp$?iSA?jhk{7t*@8gwv-wb2ibwfkv-Fk=VTW+DZYaIk zb$w{3J?BrqxHqe%_*a)&42dJM<&km(SFRhnHBwPd7gKM zfxzsj8cCevk@a7P^TrxU$H~Vu4yqD?g@>-^4Vtf?{}!%^_%c^BDht2+?KQGv2YQjy z&1WRO-U&|nvcI<9QrXA;x?44at+fwn{j;0%=Tx>&w||XDjY5lEcJ&&dByqx66X8GLix)w zmZtly*QcR+doJ56msQ zi7w80KUE-;2V51aNYx^2`GH$P8=owdO?*qO*9*cj)d-VA_c>*A!-D%Q@p})geq$wN zWDhF3)f^5WtK!-5lvQ6FkKJm6#L_Z$-i>P3Fjd^p6ZejIs$Vev6BLC5W^_kmNto zT0BBd_Khr;&=Gwzjr5Ab)PmRu-_{xz%B>8nv*n zP>}9ZI9bv_$QM#fGTU@caKTbG)`J{w+&ByiS|2m)HXR&sB{auueVEdCNeYpIKWLoK zX_4i17?@4k$`2YI5#e?i@LZz~NbdNQXIU1OSm_n&nkl5Ov7XkPPSqCqP5*${n$W+F zE;Ta?-}GG=?M!Yf_0>n>Iu7|v&lj@}y1#48ebD>O0@#jDmYMURdnDUk$<3xUCIjQd zAzuFrJ{>}EZ172~{e>}cpK7KD6xDoJSn*VSPkdEqHnxgR61tD<96NwfA8N&Oj8li- zm`lv;^s8R5@4G|O0&~IL>h^s%2M+Jvg^_-7UggPMrhMO7p*kV_ax5i;ur)>u%=Z^? zXqM(pCT|MzRBU?AC;4y5uG1TKd3z>y-gh@%t|RQN(4rH3P))=c0G0<%sF(r zJc6Ko1UR+lTJK8UW~R9$Nq$7RI@8*Xl|J@h;79S~2XE!nFEpZwwF1p_%DNc(R`Asd zQ)zE3D{p!k_2NTDu?{VX zzGM5lI^ZHpI>GzS>*$dC1Accsw;@+KmYIsQb~?+LySPOfnaD)xX1SoWk9`Aveo236 zsC*7KMBd3nw%PWs;qL%7n_>d%IMh0AvZ(1_XV-QjJUj~N&Hr7Hf)EeK3YUO2g3${v?a+8XqE zpsK!%$_zDCTYdH*M_Tq2FkTKjy{~5s621|9B@J~#WJE_=32Q9eCtu_ByoG?-5+p$Q zEnnjJVS3~-pW=HcjES+q#V6mzy5|^S9lS=HABlq0Rf^+fhNE3?;)Kyu>SDAePxAU; zdWitRE?aiKuzb7(K1qpLCEg&NnaLokPMn>^$i4gR}?kW~*Pu0WfO!lFE`VGvc-41z&oMTxS7n z#U&|iCLZNkcp3>iKKXTgH^y!dLZAm0az6-b%DpYV9s@<~)Vp-$ z9aJW?5Nx6Q9iq@8K-Ko@Mo*7M>53<=t1+R!3Z<#h)8EMlz(inqDUiDdQ}XuWu}ga~ z>4pkmZ{P2izhwdxWv)Z^cV)68n9cyP13+zZ>wk#{@l!2B4J-zFB;QcSnSL2COY&j0Q5bHPd!bC8Hgdso#cFK@`;AZjEtonr_pbp8a+PV znuB{6C1suG!=%4x^8s}bUs|smpvUlgpy#`O-mJO^iM!)*HHJnnE{EvfL{HmlfVM}* zBpDL7oq#bN-A@f3pkCOUh+x)R@{`Qvsn8bff;y<3$FPDnm5&q*z{qEWQ zalrpL;Q#+S;KlVkqbiB|`$Ur2SV7^2*}9yD00_?4H;b9xVTh z-uj={(W`V9DI`9hdetfiB5Xq2KG4@GFk2i3fu@V8EX@g~5K|V%O0QWCTB(=+Dp6Xl zbV{Bd&0iZqIQ)Qf!1Y7LnrG(~ozN8>kg|?cy9!aSZjR!x!ukDlNQg*^me)vKG8DB4vjIIIi~qM5((}BW*QY=_al@& zsT&p`Dx{!&k>0((&I3YS$`HHqmIRRQ&#zE{dCZocG!Jn%%3lY$PVe&(M&tS#lW7H2 zN z!*NLimGv>EuIyxC%B6a+B$TS} z0`dOdAQ-wu<~_IsVaI9?U)WlT{T~W zGoeH0kR0?Oy^lj6LdK)xGE^%EHgtuZwzXxgYfG%mPS(Fu+TZHtRaEe<91cUfpg>Yq z1PupWZc2s;x3Qd~&&jO+3F5-my~Jfh=J1o(P=IMLN0UV2E3LmfDtxlMl^Dc zo>~|C&sX@q13los8rGudh9WA{=w>PgOzGHw$B0I?WC=MkL~T6;0ksbt&r}!U96hSS zXEXEB?A5D%ykt@&KkuC$k=4C6ILe0)lm(8_jlJf9w8j&j1_t0M)B0pC$8g+X2vl#Oy}jS_5$x1IZc1J?_XF4JSxhAbGU_RO)3HX0U?o69|NvcjuJ` zyZ5YkEkKP>Vdv`>NZ5{tVGIImuOVPJ;w{b8%>~89|~m1Hs!j#p!!R5 zYqI@pW`9=32_ORulti7CR(nACtos-r#^u-{why+AJV;mwi^5-NP!zkiEd%K-1ChTx zruS6|Or`kiJG11UHEHf~+jNZA0}$f++S}%Nr3b z2(~I~H$$Hc2Ot^_!r1t$zoLYslCn3JIAu=QSBgfdZpD_dNj(PF&R=In0HwznXYFOa zqK5!;nOzq-2=u>cg!0le z+FN6Q0F#m&_)IPmR})CC(-wroW_y4riO@ASP+m_fa2==s%}RDI(GBT&UBL~j`k8!S z!@6bp>Kmu*lll;BS=;IZs7!yic#K_}$9U8>E^BOxCiEfkO|25hh>tCW6euj4^6Hn8=glyclkpHseP7%V*w z4{#Nveq}cUt|9=gWG=1G8VO-MD`|!OGVH9Yk;XBgHgeI1m+(L&1H2R^71!eK>IdF-vJ|wvw&YWd0;La(r|`U1&@pEK&A+k@8GTR`SMSlIN9$rtowJf&sw6{Q ziM2d%Yc8RK(!v z+Sac@Nt0sF5Z!A&z5`uwB}FA3JfqF^Kp6`O32|ciNsonuL^wxA_`2$aV`bq2v4W%+ z%Nl2Mvm$%X597B!xZUAJPtS>&4)~(j##HzcPhNqs^zWAi4O>9jP{8D$*Qd|!r-#V( zBtR^__w5SFRXfmy#8V%S)t3(E`B_n)bR9349soi}(XJy54~8Jzz4(;jr)I!dbp8=0 zPy6r~;wcjv^D&GetNt8hzMfwf<8=`|!EbUW_)20%$h={pt@v zkxvA(kT0)#sz{@&QQ8GL zc>*{h3b*SI&_3LYJ`e7Hy`HXEZ5#3efZv6J=fLdHW^t{b|3f&xA?pv}{2`qGLy5!j zCgs7uX93Xj@*g7lLqz|FMD&Mnereo)tF1S;khs-Z)jHyU|5@)-py<^!+|vmg@;{ql zfuOasyUbg>1a^dgou%+zI#8b24s@kz{D~+h2mFCN3kX&+^V4r)9{6fdP_qg=yRbucC5025ZcX}s5F!0rhd`)R5Fz0?x|-t~X5d%o_&=-sUts+jf)2R>z}ex}h8ckO1As`C-WE?wDT^?mX= znM@T(sB3_;8muzVe>di72yyM)#9mTF&Z(+l|J2l!@^F~q-J_~D15+h7X=Yx$Xf?_? zFg$Yk3_rcealHm8`Sr(y4^%@)83-o0x0a~p6#aaB1eJ|Aav97IYLBukb9FH*^7AaI z_720D?FK81% zhF1TWcAOz1w4Es&7;wUuB->|McmDGE`n_i)ncfU9c24%q4x$e`dpdv^l0>{f-fcr}YHCEkEMv@Jdof zM|ubPRFUe?8n+Dqk5Nj3KZYr5ZZXj{uaV|-?+Th@Y zC^ z&D!~QSvl7tpv3pXS36T5>t1mHu_w<;(lvuCc_>HeRh5O$BRT$cF-R+4`^3!L(v%g& zPRXdsPjwRXw(7T|fS%(kJhk$+phO2jSf~GeEv5Cer`WmgmhzrWQ_JBhpnV{wf$v&o zX}+ePm09%$W>}er2`zN1f9WCwn`E8!lHRht3}Re**jw%6DNxtD>xJ$=9!cztON+JX zpF!ecb4tS&v$6?JvwdAd?}xK;n9z??J!_c}c}}nI(=!p2HdO+orCe#7ryS2WyzNegDzr|XzZ*m!Z8|~Z+1vu zZD>u41!3w|tuTWReycJCWKF2&^fOSCy5t6GPk+=Li>C(%@LJXtPwvG$eG&%Zy%NHw zqWS|GVnL05PO8kDi0PnCn|RLbrkHz^qbfPWksdiT2;e^&LIfYPX1jt=O#yF6E6;#``J4Y5pN&yAnDE-n?}2)%N#4BwtVeJ6KKQ-Q5`Wcu`auu)YOKv3kQyw z3gn-1m#UAKDuW3(2ets@-aYM%GlLCVP)wa=YYtR2Jn~S@_WwG|(~#|cZa2|IlK7WI zRL;I4GH~5d;v5VW>mGpPTOS>(Oax5Q?Nq8~ZKq+#v6$*IX}n7&)$i`shP4<52vkz zV`2L-d1iOcDN)L8GwaHca-%8@`|p~T5#hm-C!9`e8J$ztW{g#&K4IjpS0wh>j}L`u4$ zyKuawWA-ITZG?F`b?+r5Sb`MFXykuR35e{)7|Zi#egMFcoxzpllpDatH;f5r7b8-X zWvO$q&%3EN1%AeNUOUDV$9x!Aq3TtJgR6Q*B&++A!h}IA;zhh8pgGbbf|Kah^Mq_o~Fe&S9XzWsin?WW{|^6$^T7X}k%*G&P&F{mTPytE5EcmYl^h8?LyKA3GsFV)XrX4q%bHCt_9 zMgK7YL^wQdG`mXBVvZN#U_@;-nqkrvlnaSQS2`FcQ(w3M{hlnz=Smq?@oqPO9nGbeK{hJW(f-eExVfc9jKkBhyx6P z=hHGLjrL(@^;tlNSAt5@Jtp*#uf7I{qgpC8v+3+MWV-Z8%YCNVG<8}g`XB6bTP9B% znDQei>aVG^9boh>Vq6)_5Nxk`Pv2t|Tlz7juKcPF1lv}-8`%8h?ps|<=<~|l4EJy? zrhRX4Rj_uss|%J?=$G0Q%>&w_niI#t&_p%zJNhmuvo}oD1+!ooH4mx0QT=!b7`RYv z>gJC=5jCAvJZ%NRqJp%uK(I5k>n(%jJxKeZp$*K9%n$Ms9!grSgPoikJCV5ii{pQx zp)!#g@9)z|1aO0Z`tqwlthUisi2g5cFedG;WCQcvpA)X~HC`n`mJQ6PtFIFfjj}Wg zE~2wsKmHI{BGsmtZS=fO^L5l3w&J9Wp4@>1Z3q@(-yfcRzwGc6DSTx^e$(Nocni~`3oe=} zD|BGoh7{oZpUX^v{#`epoYj1;Da4QlmFHH;d zLhleN}OG%hJ8J73u%iGWM_EL&x`^{W~)#0~(%t zjZ$E9_(d1Z!gP~bsB4yIz@bJ}{x5pe``2A7!rJL+5c2fnC(~SIDVe8!UqSl&FHgZw zJ@qNL!%C9j^k`tVI1YK@bbExQSpdU*&x}F2(jL0Y2!z0mus!rI_!awS0eW=@M1bDf z|3%rKK`lr_r@R8a9ZyS;B7t9y+xAeKUbX%@)L+2a`pfevgVjzGb=N`SQ*ql31|3NQ z6ZA50dM;bp(xdIyYxe=a;m?(rnEznu7eD9W6 z?#w?e_6Tz@XzNwwbPo+~^am-V6;xvP?4&Dk`o#(-?19Dp=Tg66idtJu-WHjv(yu{z z-&=^Q3{~yP)*Ugh1|u&enf;F35A3hp5+X=cTDst^I+9bI`i2H=~s>)Sw_PA zKWV#`W3)?eTJ~85j=%1DVsBb0bvyoiB{kYiRn=qc>sPm%a6ytMM?2#d4cbzTpUPmX zLVNWdSGMhp`xbUVA<Z%$c@RB~Lipj2s7g$w^MZ)e)XrPC46G0suK*af_+i`|c(u86VG zpi}nO!wVh~%vU03HF=X_j~)Tonh_7-1`W`n$C8W&N3y4JdL?PFxR;tL=j za-_CYin{zdpyFmk*A$_VJ2twJ6f4>woCeWUY%+bP%v`ARwofpM5Z_Fg?G+krBAJ-+ z2K5viT3j;>#L3#bS@(3}`d4ew6L%vXJ(OgJq1 zfnj;<$0D#A=Aw^0_zy8&J7&4`W%6X#bo+tlAttw(wlm*gS6f>=?6j7>`l537{+_0$ zrbot!whRYg^EnSrz@A?>dI!-r&~dXhR{iW;`H_1+n3o8`;rCacbzDWv<^c3zs>0i@Zx3hIQx-;kVVgM1Ya2w#2Drp*hPM~! zr^LZ*N8d9n(fo!3*I=*N-a2ynrI2TLI!#+=F_6)i>hrMNZnlAiGYgk6IU5fJMr?UUuxhb^o3)rZsr&Zc}S(3~Uej z=)@ItFOpI z2zDsqIMbb9KeCKay|oYQ)|5D!DM}CJG(CW!?T)HZ9iln5`KjSBrk4qip)e*d&~ui( z8r70#)gvl_Dpg`Q<2K}7u+vB!0%ieiJCu1iikU{F5P;X;5qJ;U2N-A%L?TLeTcpwM z3-`hK_Uxij&+iHeGE2K|6dy+XUSk&9kux-kd3YL0PYY3AG+MxbHANpsI?uDelGhr| zDd|twX;iq1L+hosHDz1^HqdgZuL=FLJ!mNKiIWzO>M$Iy5fsD>9#38=4(FK_#UH?` zA|)b&rV6<$M<*jq%=wRUO&xW(JS9|(5PMc7=ly`j!NyCtV>@mx-)noSBqf(U;ZI|v zQ^BoX(?}oyo+JeK-23WNenfpI67~Xen_}ET_56ff zn|P~t)#0H|-k6=d0XI#fx2yLx36&k13vkd1fj+}C(Or8RGFB2;pC2uqjv;aCvH{}l z0S9MF>@|sUSdnAmJ1TnM(W{^UERE%r|qZpnb6LGOKOUADE?MR!>~`Vv}ja6d^S!j$XIZyC({4>bJphk zb|IHwy*`kGt$+EHd$c%ReA>Io(xY29&MQxQ2bxEFCpR1t;RvkI?=55WTdt5?dqAG% zr(J0Xlvtgw(9{mbcUEUQ_p87&@MP)RR#B#NW`|Y5e70_y2l10tQa7&9Ba^EcV3f z=27Z+ z>b7q9O&PqQs}?<{ll23L4I8rPcAeh^IFFSENt?Qs@nDna24LGaJ9 z+bZSAoE!>NRqn^DjzPYA%p&G$1u+T6cHLP28dd$UgWo=BT$@{JiLqOpSvD>#xSQD# z)UNMx^IWYy0%@M;`Plcoch98j&l2h0BWp*l^d1SG2zn-;ucfEhJfry(=OqZ;Qb96GrGo$GG znY8or_blv)iu-eNYuv(!gA|-vZ;gL&nyxZ=dB3ZA?U5;t;=bs)1*%N64jew5z<1kr zF^ahO(T?w|v&7c$%B%LA*^vArIa1w@m@IA6+^(N;RoC7W%*0U>q&J>?X!hZAcg)AM z&02Kjtk%xuza+ygZp~u-C7oj=yeU#^l}7o6y??EKL@oBjM5i0|Z@6e@CuawO>2ojA ztr&Rv8ch|wonC=q{g7F zX6}KXP3-E-ak=er>dYqn->h$VxhZl-o<7GRd*F+eyc;dB12()e97vksOm6kmiu5Iw8l&-Z%N0fWDMJJo!IwSoctSK7dDw%N zq?0}Op!aD4cAKAal%?I-+>W`dX?D_(x`Zx?C$zgmV`T`7z(;WAx>SzCPJ{_jNxHrx zEi3vl({1}i1w}mHc12wBc9isP=Y*Trn!FHO+?@l@w%UBElx*`n$Q{8> zemrlWtyUVA722q^5r;MzZd8y1aSO_K!123p|J{l4e5%_sqj6RVE`b$9T*g;XtRZCl z(2pGKw`r?8b-QlkkCq?E(WtGN3x`|I;O_HC*N|Q;w0RG>vm#cJIW_Xvf^PK{jkCjC z?thNIY@nt(+T|y^HP!Q~{?=^i)fG^za@@R+!HT?)PO}Xvta(N$^I!I?xAeErwUlhI z_0++Ly%=@!!f|weh_{z-Pl&C=6XlPTseo8hla};IeQ&@1Nu&>$m)S2x_+%>3)bF8S z=At9Cnx#%S{jqr5E8cJYobqjFxACCUl4@XheBy}X#{2!0EG^agh>DzA0q%pE3ibB~ zI1e9@in4^89Fy1@t8F6~?8oZ_QMcIJyh-PM+BIg;nI0{@;%ZUk_5JmF`xHNG%mg^D zZRDvAdit#m_-8InxXn)I>6|cSk-@-1xsVQ2 zYBJGxBFMK*^1CtAmS6bC`+9|v5LSf$SB}(ZH=hCJt#u(iS!pasY8$fe>HPJ-z=Gnc z+4;ExW>y;*i8lAkiCX#(E>)KMSKn?|o;@SzcF_bf&ZC&G=@bGB!u@8=Qp9QrEYjodt>B_JLj)PpvpIX+AUc2xO^dB1dHAejx(69r!#3Zyig2_#LU!N)t50o4pr&g6+ zJ>=t?;(0gY4U8Af@nv$D1MsagT`wU^E)=8Y(fr37} zPpJ+TORJOK-jK|coUr`w&HncC*yOEQkLmdZ@rLf^yzf&Pews*FcIa&p2FsYACg0xs z{S}pSnse{vO>HaL)7+Pj@=hLFIOZwJQkn3#b@pv2wNJ}sSw6qV_-0?CgtAnaifX;W zU_!OE>sn)6_uxF#m6&~Mov783XREGSvRhc7*ATq~Un0Phb4#Nqz1JiAoMJ-Hd#6?p6k{!O_Y7(+MEe^&Z=1cJlUK0= zeSz~zdB1p+hf~2*dYk@&F?ma=T8jm}ZF6Fhg z6>yVQ>USuU4Ez3N(u#O_ZRIzyjh+tauzv9UF;A~>SANlnfr1wEEqS#l4_@BDnP#nA zW1G|x>^I6yX2j6km~GKGwxzWnN{edXC^@edr*dtwM(RX3PoMk$r&x9@~l>If|^R_<8ehn zmSs1l6S6XOr|+wgCRa-H6|}_gidsiXK6hy8`+u=gTN#P+l2yC$_KA8y#6etT>Os)< zXu)nQRX+X*JOf2dHgCI>SF7Px47)pu6m?M`=$>Lyu1+EksCmxrrWtR4x!IQNf8*b0 z<*5}mt{xCpx^R|=13@e1AwHaa5Fh!Wn& z@^~ri-_oxiSuqdQcS^q7SXmfk8R|Lg>F{J%V*Uw>JMGGup2O^;xQMf-i}yWH4dCJ( z#o5FTwq%kL4=47qjKe$Th6u(*k7tttySj<>;VWG1+Xs*dZF8j2uJF)gVnFSbtQ-Nj zXlD3&L09+i5bkOrm!GEg##Ys`(nAq}<-y*swAv02v(g(S+nA1lu&eI9ZYLnT4J#Hu ziy~Sl>xBYT5>01r@x8k}Coip-pnkO`*m;2CU9$ARVbje8xy;0V*@I#ruJm!8IOv{V zkWCf?yWe~QA8is6?b>cr(Ubd}Cf*mNdZlKZAC(Bs<4nEltp=LpfsvWt$`NK*TYa-C zK{?B9Ej@Q`XbA2DDa&t`9mx-FRVIZ?a6L~>-reinx2cC{#XnI0zRXO5xoiZE73M8I zXw>Lx^;7T4O+<-&06acaUX}nqjQ^|tj#vz}tzS|zc$jniTdL{h*pc&sV2{G+K@J55 zUApT6n#NF{twEK2E?#_`LfkQa+qz=XZ2u3{Rd>V6MXh|9*xK4k+=icF{_5gXeq<5v zqxKUs?rni0O7$iyA8Ui|yaeWdZ&s>MUxdDY2U<4`>KbUCp0FHGRq48Whc%IU*?+lL zTku3VO_Mf{r?1LP%KRotgmRZ{b$ckTG{9yOb<+u!9BRSYYz-f2(v_cTx(17+}LGI;r=iC&NG+4T`e*`zToo>RLq%6pv|16NT9 zny>e;dM{>+k{-GkNiwxC;5(Epzx=S}>(sjg6}^N|p~zU^QuV^^C~syF-yfuKirxBl zx~{X=rY^k~9@kV?qMEy*Vi2!>L>^eBF?IewCN&b{QQp|YG!-Nl=jPexUM6S&4A$Nc zWi_dB?#(Y#)YCqPn8etB;NUJ2$nT##SfqFuRLSRTAqKZZ!a|}CNKO?PRg+5WQL0wo zyR0arH)1#I-fl!lzt61b)2{C@S@%V>-mX74*DmvcNja~mjf<+@%eBKRE>&ms#q%wd zN0T=tr4(mly~kYLMPkQW$z9&#fVo|{OaCEZX&bhgY5+mtq+AtFn_8slc*!QYXYDV{ z9*V21atc$ko<6WRp<(alwClZ=wdbIM^miuZ+1{0c$r#e-V*b^v-I@l8-x@hsgH5VL~b_FqR&ZlDp`ZKRZgtRy2Q2Nex?{}kWo=DSl{K$C_cIyA2=xgyAA`X85?u0iNG7&p zz1!8_-u1$q0$D@LaBO$aGkCmzY)U^Ldnm@$0FL`4sr7_uKE6m*p7PXfGe!zgIhRY+S{#+ z`ajod<7~wtR1~knJ0ARX^$xGHYx6svOoJIIQlMKv+R=`}c1m@!>dNURMJ;!auaCtx z!tXPv^Luf>Vm+z=v3q=;98Jy^?W`!|$jat1Tlye;?SFLlm0?kE+rNUKBB8!0C=!E# zN-Et9AcB&T(jwh8fG~uE3ceyZii9w92}2Lvq6iX0gEUACH4NQxH@@e8j?D3XyU%m) zbNvJ|vt#Ym>$le)lr&>5Oy&O+BxLu)=+@;HmYAR{%X%5UU5tHKm_c-hdve*Kca~2* zx!i(%Ff&paLp9%L)PG@0KBIqB((tV5^N+NSogoj}kq&CkCui*a+ft{bcbe6HbZ}kh zDAUS5@4?M0t1~y{Zo9}<%Rc>+R#Y`^ICT9k=Yr-npRx=0-%*_A%LB=zpZb#@kEkd_ zGyP#QiOJFy`23eZuJX`wCcAW8JbLudsKZp@Gtia%|75OGlk7dH>PC>=jXJEk{kATJ zf0DJpzZ-RCC%q4Py(p4iQ6|zP$%cn!(gi4!Md1sGYlq%D$vd{+MmZd`gZnU;5dk9i z6l8Ay0=szsOo6x*V0}n~XP|=yi8#nXQvkp6J~Wx)_XRgwWmF(gd);+~aE3Y5NH4`X?6q_49V}|cJ?YaLg z$^7n!3fIh?5*;$VF%ZgG}Om5-Iw z)@0w86fNnh8P*8Pn2ZEQu^a(p~J{gFe zPa_}-K`YcVi5JRhUbb>R${SgIj~*;H-rvNsd(N!5ITtlppMta@Yx+WW8dX(9)n4}( zg!lA|aZ9O!=XS0~3_DY|J2P(Ce1jc3#$|f{uC(USZPdsD>2j{33a!`W=$Osb!e1}$ zU41`L?pV!fWX#RNbt}}<*8RH|Ux5nlV-n;U)SJ|^RHUPxikyWnK8aBv6HP_vlk)XOPM&FY)ZVQ0@&4-{Ph z+M+J!#F@X3D1Ngyhvqzo_lF|(g+nSms`Z6qzlKU+j&`&ZL)Vt_%`~P7m=&7tUibB9 zE$O;fo!sX_F`O!a1LQWaR~g^P`~9*7!GF71ks|E= z0`jy&P|xNQ7ufU&y3HN!d-*9*9SU=(mNzBwk5x|Q_cQ(U-+BM^T$BtXh-|)%>!LmF zSMzo>j;IFmh7QczK6m|<;yKP1iW_aWK_nk$`@=%N z9np~g^T}6SK=cO!lm2u#r>lj(2fzOQ706Ez{>#HZ?&bf*BSm7|cCs1J4??!A zi)?IG(UpoG{X70~2xv`Lo_n-j;Q{5ViO7s8WLG4M-i^oXy4}rbBRG1$n%(sEAfD0C zS@yUs2li-nUYkd`cYOcMj^NRF7v078o_GI56vC;A5BN`WtZ5P>SJsexLqnNjJ*J4L zO|OP68+gOkUTUC0;nsLsAj-p+x`g%*BLGamgx!cPv(i8_veOD-5X=Ek1?hUKL40Q2 z^QV~dGd>$mBelekD<7d)%YaPntv&6_RJw&1H;Ib<|A@|YQV}r^yn{M~-jk-Z4VwLJ zHIb5fg4AN6q+evBAP_|{vA*L?cL!k*zMHxf`6o#ThhnprCGMY@sHJy16*=sbfIu0q zYw73V^J1!FUQP#l`+(8rEOI*tQ(+tuG)Urg& z*@lm-;H9nI(|;nmSrQbxU~y^!Mk4|W=(}#?AO9o;rzSR;e&_pt%K{{rlnsei+F^A0 z%_mGmB6F)Tss?th^VMhzaselw^C^`@terd(5v8K z$Z+udp(1GemjYTB#+E3Oil|nca3Dfs93y#GXxrP^lck>kB7*Z2Fv76m_68v?vFGv# zC&FMn>l2areg}_Ty{)$XCBjz;nW3%=8Eg`i46uJtfZLN~tO7 zI$nw$$4eP#zikP8xQbLHL{HcdF&dW&^mu6>#H z6l%Tmd#B|EDl%`d=4?xGy%Ol!r1(OsKEjv!?$yWBp6NUL@@o!!qYHBrya6 z6yQtJb!0c}jQ(|`;+SHJHL;8*0?dzGsEHKm%wdW%PC$o<4WaRUKc8B@qUCW2F~Kxe6QK+A&~<_)sB- zR^t{liD}V zacyY{HjHmsZ;u5Cp^{hzJrfHYHAcNHk00SCg;YRvUIC5X9`Ka4+06Uvi3ASq@2#y7 z50m5-qXq4sXpKkK1D{=dU8cfG>|mpv-E(v8x^h|A%9+ccbB>^r-ehQ_5Jh$oFTz0F z26Y5m-aMs}e%F!M?ue7RAzs#tx0bv+*m z7fVR~vHEO|!>9bheUO;Q+_os@9D2mfFsQY#A>yWZ0v0Z1B%*toav9}g$FBk!PB^P{ z{eDV_ui$Y15>hg!ye#DKK>)2I7ST5Lsd8ua-2$6kr%46^3T5ZuFyAY4%lFxFPm6VU zbBXWX>;59@zIu8`;AeWSRPr|&at)|)(@TjDmAV6jR^~H%P!qC@gPZDa`Ie4vZSk7+ zX zowZKa$)T-i)Xp9Of8$l`h#Cc%%~wY(&uz*}*YsctK83pHS=(7LzOJfz%PzF~nhA~c zxv@>Kn|7L@)4+M!u-`Svzw%y64{6Il1_5IslJ%B%Ob}8>K z@9rrHm;K``BDmqLm^&_wCBp!z@U3}Lf3ogU%JSOO5Z3>kT-J(QVEJtAS@|d}{UmBn zpV2TmUdJ^WjF(c#?mm1x*|of9nQ+N=aKQZWf~?gu2IN^Nl} zx&>D6Tvyv}X)sVVuP+R7h~iLm_=g^C@zU6>1#0Ti2a1a313g*lhK6`fx&(y5!-ww} z+scb!b3I%WUfUH5&(sEbMDrT;TzSfPGwIwI_}uL(XBot2CFYR&aXi8o!iVKS5C3G- z`Vij5n&W(u@mG=P4cm7yVz6^3V`x>HCRm3i-s&hh{Pk5?wdI|)G5JAl4BX1EbO!Z~ z6=(a{y_a%D?s@eib1Oo~axV+Z6?@8+Ij!>b@4AWTYMZV4?!fPSojOf^IQvYU*5QPW zr6!Dgl%LYPL_!=Kz3bA%=L(8^(XwY=`0Qj;bY@GMTXh+^&MCjzz}%>EBK?-z8IvOv zDeG;l_)g9+jPSeAWg1p?XWdt(5tZ>XH8LY(ue2hUz~h4IBp~ zCW?Ufv*zE_5-rr!%c0XF)>%Q=%MFM=qHK!vdCBuMWK0@+1Y^MPE)pI zDwf7FciWc+PhwjtOJ4R6dMmT$`}7S7z7G5(V_O>AwqZya2z~8m`XkyQ0jR!C=OGgV zeTSUlOpd2q4q3#6Sx_6+^IV%o%oJ@SN)ze?pT3V;6K85Akb>=&j1s&(@{)E!k{9 z^dMF2WpM916Jj^^(-v4>rH{ltrZ#pnt_1)!U+SL@A|4-5YA(+@DHr%KHD4WLqj6*= zq7g%viy3uz26tA(nkN3XcKdtR+M;A$AdNZ{YybS9L2G{HyYYx2cdNHSalZ2AZKD_| z!fUA(pk$49x{! z5N6^n`#}{tgt;Mn;X_a7%WJTbbUJ%kcx9g)Jo^GY{eZEoWCV{s8+b+mvu@om72E0n zoMm3ib-T2xZc2wy=!{K3&8(U}mncd*&e%`B(CRYn4Q1Y|Eq}$qhi%$q!MhsbtGrQj z+5joVkv6om zpd%rvVUfj&pk`^Vd)goSs!PEEjjLOMbP|lKxritsgh0nx@Egclt>w;l1;^ zbq_!!pE_xLME$)4>Myun+2dlGM=C-7IR`xQ(~iSHf%VmxmfLDE^~!;71vP;Mm6PS& z>v9>DK6yXKsB$(Yb*0H?X$z;~)C;-<&J3l!)ldasCxQ@{=!ikG=h*6x=1Y7iLH>fy zMJ%`IhLNYI6YG8If3G(ccDZQuKR%zr@e5c@%E(BLyhf zRCF?1`Sj^e0H)Yzg?TFL@ZtW@a1=(`!N)z;Z6>MtC(W5CBbSArG!rT}Z-v9FFEiMb z&dpw-U6(mCCNU5z;Myu-B_qQndUtIyI^^#%(K&Dh#$}_L{*l{26tm|U1JU7+#}~H! zyl0xF(kka*V*ys?lc_^4V_k2vzVu@V96q~dCz%(U)4~;Rh zU$2U>kUovKwxsvq5u@Ja&%^|Aze-qXlH;(|&Iu2;7#8EoBdxK*6~EX64_S|KrED@+ z^U8Ab9E@A`XnA>Xz1LBKhAkw1(Pr^+O~>SZ-F#lA7bI3f_`=j+=&|io+CT*l)`sN; z6yr`DED!JEAG%;!_fQ#9+f7Po#Zlan36xy?h0~0%z@gnD*M7xnalLJK^xR7vqmw<# zbL1qJJ-gG_)gP9@#EjNDHDRD;_j~*TeL$Xn9jRXiOP?3|a&7!0Axq?o@J7>!C7tIZ z$0?^ylXwOjIgX)nj|gcCl2h=DHU(bo>vJnMIsEWC4Lm|u}pXFb2X8%Wqv?QIA*+{x64 z<^N(|SR8M7YQl~}@^{xA(oNb2TFe>bwo$zsysm8c;xmVd!6pGgvoUBh^=Kf^r`+mo z@#0_BFS`~+x9voAP&86m{1Q_zBO#_M3{|uCbFK zqT3(Yts1H;7;Jkwz^`X1^p^+_yceZ#GBxY*7qV%Q6$?r_g_w3&6TDzA-o zzD@}!444JL9Qq4xO+0 zcgG?YB!l!!3ok%|oEa1`}d&cGTnXbija8=9Glo0?hEQVxB% zCuY-Ef)|F}v{Tsj+f3@2L}6Axb%(Q6AUOO+Xi<6jQXFP-k9_3OA^L&;w#@_2PR@qM zIae}F`frW z7E&YQ8<~A@dME_msB*?wiB-E*pz`l^wjZ-y>7g+GIJwkbU0>fSH^+rGPCbZ@O|3*s zr%F)3Q!lPPpQt5WCnK*RDZ9-@uORtMqsso-_OyD+)2Gd*+Y-w9N}iC)8a@nXMF)@D zeA31)NQ8aIO3giI>#K+RXqY+?NkM7b-1@k^nz2wiD_v_xO2Q!~?y7)=i)_qj zo8$hYtjI>+IAd>;YBFz<^mQ#ow=mW9o)8T8C4tN$b4ks|{W{STscBQf7ae!EAIx|f*b9LEr}cv zHuudT8!_pf=5?u~>P;Jlyec6qhKx(TPw;~eA6~z)J7t*G80Zmm4S)Li!7CB5=v-+? zFBxaX5fvyy+DF%LOFOfMt0(V8{J5~^TsT*LwP0~ujnWrPz=Nj{_gvjK325C9(oM^g zO);fEKm|36oST2}wdP>uU?RCoznBXAJHU21+!R`ApFwJJc~LWEGZ?|1W(BzDU0M4{ znG;7nqJQ^{h|f82Ct}YnbC7`X3hC2n-|Ay7vrD}2w0|ejM{*5>=M!t!v167wVlpS_ zPad>y;sVhV?Lz+bsZ@CGxBHLZYw&oR&Y~??17)>8qd_-Dm<@jvx_w*dn4q-<%(REvW zF?GkS!SbcK^pGwh{C`5W$Ad0rm?8W=9& zwf;f+`H8;nSs!0X*HrW5lYkyxcEc5(J^p9Q3=ItCIsZx+Nop}kL)T$HYV=ZAHUG#{ z*VIf-yUV#PmN6E$Ufa|q1Bpm?6b!*_w>GP9;e#kqe65i`bbQzF@4zjkxp~Twr>^TK zO7W$h*oDP5`~?j1iy@D7#Ex8fp;)c1F>ymS22{rf9TrittCcg()im4X&n-24RRfpEWf9zl4T(J$3+UM&VZ_|POWfdL^oRdC1+Q>Yu*gXuKjh$`Q1j&0ySOT z8BJ%NPop%g+pBnvz3nyE*;1j#BKuJDCjSE;^o}XHOSF(qnFX4g$Xx*`?7x1#`m|)q!jLsd=lY}P?flqgO74-^CE;*uMI!P ziVGiRiVQ8dN7$wI^bK_eFSjz^!l}+UvV_}D?#RKvTN7lsK;-^@pq1wxiG)n~L3V$I ze$_!>E6R&uzH%`r=~_;YM(cH?2018N|HuDNmW4zg7g=))blD!Flo(%?ESP5h#E@I6 zNEoins-vyNsdbhGwLCd3X}nl{e+`9Yt6&h!baE~BO-XPoYI)%- z>W3=-dU|4Y!*c4)rJh0O1y{Xd2d?oON=}5+eeNecy`X_u8i5T4Un#F@uMv0ak*dl! z3=;kOQFr1%M76>mx&jf+T;BF;cF`6q)aSB^aU@sn*Tou9bW5hj^{*%fmfX{WNFNuW zo|@+^@Q}A9C9HSyW+ zZK?2Ls@0bAY2vhSp2N6FkgdHiy|?~ex(=^=3>N`zak);RF_(AtQpN$~(_`=2e}T}` z&o`_?RqXL`IGI(+0h253_PeA_EL;atE3ZrWVF5is?Z;OH{G>Y#)=wr_6FIf*AfKJ^C>IoQqlz zWq4I|=ZlWpBlNm<*NCczwbfH}xr1Uq8+Z@WkwbYSgCl8pg+QLjktUeRXrrxEiA&7u zNcaSK;${eyh7Vi+php8pIMj1$ysMSfa^y>GM~q8YDNlJ|bfwhpN=+<2GdItpw_$w1 zIHpi#!CO+8Q)qW^kx(2fqz7XzTLi&2cdf_oW?dl+1lt*Ap}pDgI|1JcGB{FfaxYpN z2^wC|(vi3SWc5}6@0OMV8hwL;P`=ezEt2hqa_oHO4+fW-H96V45~|N@zI{;OC=#5i z2v-Y)W?!#Ju_&uIzuY)ks;YgGUf`9}8PU5dT}wU_^WXPm0*vo{vY}S&ZnFVkoi&;{ z(zC_JxBD|+=wFSHSWkBoS3e_SNUp8(yn7kAVRH1bue1j#h3-;*UL8Ed<91rGQiz>` z6{nF5CdifrWit#EAueck&(6%C@8Y_GG*uW~pLuV5I&S_nuEF%+ZN((hjf=a$ospf2 z2~99zP@D!5RkO1cno(3 zMk8T$wkzOSmZS*$_YKB>1bNpe3Q25}O%5-UR|cifw3-%^(Lg_y7*|I^>_a-WSMIkA zOEuxe)^Jfx&A@EB^LLr?bXmb>3%$5@c>7p}C!0YRuHDGjh(QL`jB_jQ_C^dYG%~a= z_UyKgeg1r>_A_v;l!WTv1ZMAK-^!MFQ*zJdz%s=4n1M#pbO~3nlQ*YhE)8{v~ z>gX30YhFORt879mw#^*zubHnW&9aHWp8xk{5H+?9+PitEAhFM2!1eO$|Y12F(jc4 z1)}|y^wz?2r$Fv|Df*w&)bA0|VP!2BFyUdK^q)%6e-!wypMF6*@e>AT|6OhR&jNn^ z1f2qlGhZm5{H_-Qh|%P!GkA-5s}x{|*Oe5GpSs2g5GuD>sfi|mw7CFc=wZu$s_^N6 z%)ILemntzT1S$at>2+-$3hv=^u^~IP9vw%FvS$id2xtS4BRoXczc7_e-X?QARpkde zdOzyfCVEdDj}8ZLgZZqCe5B$%YDF0yp)huX=9>@Fy7a}n3!0Q3pe zqo&PQKE;Bn-pV|B?7xsM3RPg=%gWa05UGF^0$Ojjf3t$Wc3SWltetLmxn%9lxkV*N z+5x01a%;FC(t0fON$N}22Tma+-&$DH3NyF&pMi?)6w>v4AJIY@4$+Ku2h^imm5{b4 zq#~g`e~*ya>A|E=D&t9~;K_1KrzR>E(RC6;q0krFeF{RK;V!p8NeEgbfZd zVg&sw3#`2sAeI|I=FuzBZbOW7EQoD%W```dM9y9niEmb~Wk_QscG3o-`!w^!eXS&moD`xgMW%NlCFy$;{;Jj!5z$J9~2|%SL#!qaWlB?; ztAo`!Isw9tK9^KvWu&>hsmXk@F$_HCvT_yajsOnz{T&*nYrQY@TKLSgSo*qU0cHSS zecXV!w@VXQW(arx-*qsTTU=aWOkzcrACJ8ag04`&76$89L*{OHdX{Q~o*BK~1b>dJ zL^=W~NOA+om(=WSVb&MbjZRKXykg&rlR0IEhJxg&c}>mn>rzsx%P!HNuf|e(YEbO{ zbLg2;yS=c9QX);!aXtQE%br?a0D&4IMA*%7ef3PY93*x$>Ihw=?EApt!d(oozXRxe#r(@?Fu?Vgh`<6!QLPde=nwoUdXz`dxi zf8~lr&M2s%4?a>172H5!=_4Gy>a1IZnKBsWnbMBmi{X1B5Zz^}d}?B~Z0bad6lrFD zRF?;o7|^B5d6sI@{~#+X!Jy`ab5Gg{7wyOL7bEJbnZ>n|9j{Iu7eIK)YG<)# zSjb(p%`DgEJ$QZFOp6u3H;9=2@YieLPfI|bUm)g(UvQFmYf|NTR(i&IBU3uJHt@14 zznu-S==>V=tN;>YWpg8xs_TSPnX1RRhNYk*CG`K98-Sw^SgLxj`}Li^`0yC`cVABB KZnn&0|NjNl;jXX% literal 0 HcmV?d00001 diff --git a/docs/user/alerting/images/pre-configured-action-type-managing.png b/docs/user/alerting/images/pre-configured-action-type-managing.png new file mode 100644 index 0000000000000000000000000000000000000000..95fe1c6aa095865aa5b7aa5a84827776e859c02c GIT binary patch literal 138021 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
}-g+LBywLeEL+J=JY1I)5rVRPFnLVlU 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 literal 0 HcmV?d00001 diff --git a/docs/user/alerting/images/pre-configured-action-type-select-type.png b/docs/user/alerting/images/pre-configured-action-type-select-type.png new file mode 100644 index 0000000000000000000000000000000000000000..5f555f851cd816d6a13162e6b86125eee2d24299 GIT binary patch literal 274678 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 Wj6`}@mHYzyck-zIADM>{xBd@%%m;!1 literal 0 HcmV?d00001 diff --git a/docs/user/alerting/pre-configured-action-types.asciidoc b/docs/user/alerting/pre-configured-action-types.asciidoc new file mode 100644 index 0000000000000..780a2119037b1 --- /dev/null +++ b/docs/user/alerting/pre-configured-action-types.asciidoc @@ -0,0 +1,61 @@ +[role="xpack"] +[[pre-configured-action-types]] + +== Preconfigured action types + +A preconfigure an action type has all the information it needs prior to startup. +A preconfigured action type offers the following capabilities: + +- Requires no setup. Configuration and credentials needed to execute an +action are predefined. +- Has only <>. +- Connectors of the preconfigured action type cannot be edited or deleted. + +[float] +[[preconfigured-action-type-example]] +=== Creating a preconfigured action + +In the `kibana.yml` file: + +. Exclude the action type from `xpack.actions.enabledActionTypes`. +. Add all its connectors. + +The following example shows a valid configuration of preconfigured action type with one out-of-the box connector. + +```js + xpack.actions.enabledActionTypes: ['.slack', '.email', '.index'] <1> + xpack.actions.preconfigured: <2> + - id: 'my-server-log' + actionTypeId: .server-log + name: 'Server log #xyz' +``` + +<1> `enabledActionTypes` should exclude preconfigured action type to prevent creating and deleting connectors. +<2> `preconfigured` is the setting for defining the list of available connectors for the preconfigured action type. + +[float] +[[pre-configured-action-type-alert-form]] +=== Attaching a preconfigured action to an alert + +To attach an action to an alert, +select from a list of available action types, and +then select the *Server log* type. This action type was configured previously. + +[role="screenshot"] +image::images/pre-configured-action-type-alert-form.png[Create alert with selected Server log action type] + +[float] +[[managing-pre-configured-action-types]] +=== Managing preconfigured actions + +Connectors with preconfigured actions appear in the connector list, regardless of which space the user is in. +They are tagged as “preconfigured” and cannot be deleted. + +[role="screenshot"] +image::images/pre-configured-action-type-managing.png[Connectors managing tab with pre-cofigured] + +Clicking *Create connector* shows the list of available action types. +Preconfigured action types are not included because you can't create a connector with a preconfigured action type. + +[role="screenshot"] +image::images/pre-configured-action-type-select-type.png[Pre-configured connector create menu] diff --git a/x-pack/plugins/actions/server/action_type_registry.mock.ts b/x-pack/plugins/actions/server/action_type_registry.mock.ts index 6a806d1fa531c..d14d0ca2ddf84 100644 --- a/x-pack/plugins/actions/server/action_type_registry.mock.ts +++ b/x-pack/plugins/actions/server/action_type_registry.mock.ts @@ -14,6 +14,7 @@ const createActionTypeRegistryMock = () => { list: jest.fn(), ensureActionTypeEnabled: jest.fn(), isActionTypeEnabled: jest.fn(), + isActionExecutable: jest.fn(), }; return mocked; }; diff --git a/x-pack/plugins/actions/server/action_type_registry.test.ts b/x-pack/plugins/actions/server/action_type_registry.test.ts index 26bd68adfc4b6..3be2f26557079 100644 --- a/x-pack/plugins/actions/server/action_type_registry.test.ts +++ b/x-pack/plugins/actions/server/action_type_registry.test.ts @@ -28,6 +28,16 @@ beforeEach(() => { ), actionsConfigUtils: mockedActionsConfig, licenseState: mockedLicenseState, + preconfiguredActions: [ + { + actionTypeId: 'foo', + config: {}, + id: 'my-slack1', + name: 'Slack #xyz', + secrets: {}, + isPreconfigured: true, + }, + ], }; }); @@ -194,6 +204,19 @@ describe('isActionTypeEnabled', () => { expect(mockedActionsConfig.isActionTypeEnabled).toHaveBeenCalledWith('foo'); }); + test('should call isActionExecutable of the actions config', async () => { + mockedLicenseState.isLicenseValidForActionType.mockReturnValue({ isValid: true }); + actionTypeRegistry.isActionExecutable('my-slack1', 'foo'); + expect(mockedActionsConfig.isActionTypeEnabled).toHaveBeenCalledWith('foo'); + }); + + test('should return true when isActionTypeEnabled is false and isLicenseValidForActionType is true and it has preconfigured connectors', async () => { + mockedActionsConfig.isActionTypeEnabled.mockReturnValue(false); + mockedLicenseState.isLicenseValidForActionType.mockReturnValue({ isValid: true }); + + expect(actionTypeRegistry.isActionExecutable('my-slack1', 'foo')).toEqual(true); + }); + test('should call isLicenseValidForActionType of the license state', async () => { mockedLicenseState.isLicenseValidForActionType.mockReturnValue({ isValid: true }); actionTypeRegistry.isActionTypeEnabled('foo'); diff --git a/x-pack/plugins/actions/server/action_type_registry.ts b/x-pack/plugins/actions/server/action_type_registry.ts index 735ec349837a9..723982b11e1cc 100644 --- a/x-pack/plugins/actions/server/action_type_registry.ts +++ b/x-pack/plugins/actions/server/action_type_registry.ts @@ -8,7 +8,7 @@ import Boom from 'boom'; import { i18n } from '@kbn/i18n'; import { RunContext, TaskManagerSetupContract } from '../../task_manager/server'; import { ExecutorError, TaskRunnerFactory, ILicenseState } from './lib'; -import { ActionType } from './types'; +import { ActionType, PreConfiguredAction } from './types'; import { ActionType as CommonActionType } from '../common'; import { ActionsConfigurationUtilities } from './actions_config'; @@ -17,6 +17,7 @@ export interface ActionTypeRegistryOpts { taskRunnerFactory: TaskRunnerFactory; actionsConfigUtils: ActionsConfigurationUtilities; licenseState: ILicenseState; + preconfiguredActions: PreConfiguredAction[]; } export class ActionTypeRegistry { @@ -25,12 +26,14 @@ export class ActionTypeRegistry { private readonly taskRunnerFactory: TaskRunnerFactory; private readonly actionsConfigUtils: ActionsConfigurationUtilities; private readonly licenseState: ILicenseState; + private readonly preconfiguredActions: PreConfiguredAction[]; constructor(constructorParams: ActionTypeRegistryOpts) { this.taskManager = constructorParams.taskManager; this.taskRunnerFactory = constructorParams.taskRunnerFactory; this.actionsConfigUtils = constructorParams.actionsConfigUtils; this.licenseState = constructorParams.licenseState; + this.preconfiguredActions = constructorParams.preconfiguredActions; } /** @@ -58,6 +61,19 @@ export class ActionTypeRegistry { ); } + /** + * Returns true if action type is enabled or it is a preconfigured action type. + */ + public isActionExecutable(actionId: string, actionTypeId: string) { + return ( + this.isActionTypeEnabled(actionTypeId) || + (!this.isActionTypeEnabled(actionTypeId) && + this.preconfiguredActions.find( + preconfiguredAction => preconfiguredAction.id === actionId + ) !== undefined) + ); + } + /** * Registers an action type to the action type registry */ diff --git a/x-pack/plugins/actions/server/actions_client.test.ts b/x-pack/plugins/actions/server/actions_client.test.ts index 14441bfd52dd7..c96c993fef606 100644 --- a/x-pack/plugins/actions/server/actions_client.test.ts +++ b/x-pack/plugins/actions/server/actions_client.test.ts @@ -44,6 +44,7 @@ beforeEach(() => { ), actionsConfigUtils: actionsConfigMock.create(), licenseState: mockedLicenseState, + preconfiguredActions: [], }; actionTypeRegistry = new ActionTypeRegistry(actionTypeRegistryParams); actionsClient = new ActionsClient({ @@ -221,6 +222,7 @@ describe('create()', () => { ), actionsConfigUtils: localConfigUtils, licenseState: licenseStateMock.create(), + preconfiguredActions: [], }; actionTypeRegistry = new ActionTypeRegistry(localActionTypeRegistryParams); diff --git a/x-pack/plugins/actions/server/builtin_action_types/index.test.ts b/x-pack/plugins/actions/server/builtin_action_types/index.test.ts index ac21905ede11c..9150633f06117 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/index.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/index.test.ts @@ -27,6 +27,7 @@ export function createActionTypeRegistry(): { ), actionsConfigUtils: actionsConfigMock.create(), licenseState: licenseStateMock.create(), + preconfiguredActions: [], }); registerBuiltInActionTypes({ logger, diff --git a/x-pack/plugins/actions/server/create_execute_function.test.ts b/x-pack/plugins/actions/server/create_execute_function.test.ts index 6bdd30848e4b7..1b7752588e3d3 100644 --- a/x-pack/plugins/actions/server/create_execute_function.test.ts +++ b/x-pack/plugins/actions/server/create_execute_function.test.ts @@ -282,4 +282,65 @@ describe('execute()', () => { }) ).rejects.toThrowErrorMatchingInlineSnapshot(`"Fail"`); }); + + test('should skip ensure action type if action type is preconfigured and license is valid', async () => { + const mockedActionTypeRegistry = actionTypeRegistryMock.create(); + const getScopedSavedObjectsClient = jest.fn().mockReturnValueOnce(savedObjectsClient); + const executeFn = createExecuteFunction({ + getBasePath, + taskManager: mockTaskManager, + getScopedSavedObjectsClient, + isESOUsingEphemeralEncryptionKey: false, + actionTypeRegistry: mockedActionTypeRegistry, + preconfiguredActions: [ + { + actionTypeId: 'mock-action', + config: {}, + id: 'my-slack1', + name: 'Slack #xyz', + secrets: {}, + isPreconfigured: true, + }, + ], + }); + mockedActionTypeRegistry.ensureActionTypeEnabled.mockImplementation(() => { + throw new Error('Fail'); + }); + mockedActionTypeRegistry.isActionExecutable.mockImplementation(() => true); + savedObjectsClient.get.mockResolvedValueOnce({ + id: '123', + type: 'action', + attributes: { + actionTypeId: 'mock-action', + }, + references: [], + }); + savedObjectsClient.create.mockResolvedValueOnce({ + id: '234', + type: 'action_task_params', + attributes: {}, + references: [], + }); + + await executeFn({ + id: '123', + params: { baz: false }, + spaceId: 'default', + apiKey: null, + }); + expect(getScopedSavedObjectsClient).toHaveBeenCalledWith({ + getBasePath: expect.anything(), + headers: {}, + path: '/', + route: { settings: {} }, + url: { + href: '/', + }, + raw: { + req: { + url: '/', + }, + }, + }); + }); }); diff --git a/x-pack/plugins/actions/server/create_execute_function.ts b/x-pack/plugins/actions/server/create_execute_function.ts index ac324587c5f4a..db38431b02cac 100644 --- a/x-pack/plugins/actions/server/create_execute_function.ts +++ b/x-pack/plugins/actions/server/create_execute_function.ts @@ -70,7 +70,9 @@ export function createExecuteFunction({ const savedObjectsClient = getScopedSavedObjectsClient(fakeRequest as KibanaRequest); const actionTypeId = await getActionTypeId(id); - actionTypeRegistry.ensureActionTypeEnabled(actionTypeId); + if (!actionTypeRegistry.isActionExecutable(id, actionTypeId)) { + actionTypeRegistry.ensureActionTypeEnabled(actionTypeId); + } const actionTaskParamsRecord = await savedObjectsClient.create('action_task_params', { actionId: id, diff --git a/x-pack/plugins/actions/server/lib/action_executor.test.ts b/x-pack/plugins/actions/server/lib/action_executor.test.ts index 124e5951c714b..d6719dc08225e 100644 --- a/x-pack/plugins/actions/server/lib/action_executor.test.ts +++ b/x-pack/plugins/actions/server/lib/action_executor.test.ts @@ -224,6 +224,50 @@ test('throws an error if actionType is not enabled', async () => { expect(actionTypeRegistry.ensureActionTypeEnabled).toHaveBeenCalledWith('test'); }); +test('should not throws an error if actionType is preconfigured', async () => { + const actionType: jest.Mocked = { + id: 'test', + name: 'Test', + minimumLicenseRequired: 'basic', + executor: jest.fn(), + }; + const actionSavedObject = { + id: '1', + type: 'action', + attributes: { + actionTypeId: 'test', + config: { + bar: true, + }, + secrets: { + baz: true, + }, + }, + references: [], + }; + savedObjectsClient.get.mockResolvedValueOnce(actionSavedObject); + encryptedSavedObjectsPlugin.getDecryptedAsInternalUser.mockResolvedValueOnce(actionSavedObject); + actionTypeRegistry.get.mockReturnValueOnce(actionType); + actionTypeRegistry.ensureActionTypeEnabled.mockImplementationOnce(() => { + throw new Error('not enabled for test'); + }); + actionTypeRegistry.isActionExecutable.mockImplementationOnce(() => true); + await actionExecutor.execute(executeParams); + + expect(actionTypeRegistry.ensureActionTypeEnabled).toHaveBeenCalledTimes(0); + expect(actionType.executor).toHaveBeenCalledWith({ + actionId: '1', + services: expect.anything(), + config: { + bar: true, + }, + secrets: { + baz: true, + }, + params: { foo: true }, + }); +}); + test('throws an error when passing isESOUsingEphemeralEncryptionKey with value of true', async () => { const customActionExecutor = new ActionExecutor({ isESOUsingEphemeralEncryptionKey: true }); customActionExecutor.initialize({ diff --git a/x-pack/plugins/actions/server/lib/action_executor.ts b/x-pack/plugins/actions/server/lib/action_executor.ts index ac574decdba71..59f8f3747273f 100644 --- a/x-pack/plugins/actions/server/lib/action_executor.ts +++ b/x-pack/plugins/actions/server/lib/action_executor.ts @@ -90,7 +90,9 @@ export class ActionExecutor { namespace.namespace ); - actionTypeRegistry.ensureActionTypeEnabled(actionTypeId); + if (!actionTypeRegistry.isActionExecutable(actionId, actionTypeId)) { + actionTypeRegistry.ensureActionTypeEnabled(actionTypeId); + } const actionType = actionTypeRegistry.get(actionTypeId); let validatedParams: Record; diff --git a/x-pack/plugins/actions/server/mocks.ts b/x-pack/plugins/actions/server/mocks.ts index bc4268bb69872..95c8b094dfd70 100644 --- a/x-pack/plugins/actions/server/mocks.ts +++ b/x-pack/plugins/actions/server/mocks.ts @@ -20,6 +20,7 @@ const createStartMock = () => { const mock: jest.Mocked = { execute: jest.fn(), isActionTypeEnabled: jest.fn(), + isActionExecutable: jest.fn(), getActionsClientWithRequest: jest.fn().mockResolvedValue(actionsClientMock.create()), preconfiguredActions: [], }; diff --git a/x-pack/plugins/actions/server/plugin.ts b/x-pack/plugins/actions/server/plugin.ts index 280c14ca8c058..4c2c8d214f976 100644 --- a/x-pack/plugins/actions/server/plugin.ts +++ b/x-pack/plugins/actions/server/plugin.ts @@ -65,6 +65,7 @@ export interface PluginSetupContract { export interface PluginStartContract { isActionTypeEnabled(id: string): boolean; + isActionExecutable(actionId: string, actionTypeId: string): boolean; execute(options: ExecuteOptions): Promise; getActionsClientWithRequest(request: KibanaRequest): Promise>; preconfiguredActions: PreConfiguredAction[]; @@ -170,6 +171,7 @@ export class ActionsPlugin implements Plugin, Plugi taskManager: plugins.taskManager, actionsConfigUtils, licenseState: this.licenseState, + preconfiguredActions: this.preconfiguredActions, }); this.taskRunnerFactory = taskRunnerFactory; this.actionTypeRegistry = actionTypeRegistry; @@ -271,6 +273,9 @@ export class ActionsPlugin implements Plugin, Plugi isActionTypeEnabled: id => { return this.actionTypeRegistry!.isActionTypeEnabled(id); }, + isActionExecutable: (actionId: string, actionTypeId: string) => { + return this.actionTypeRegistry!.isActionExecutable(actionId, actionTypeId); + }, // Ability to get an actions client from legacy code async getActionsClientWithRequest(request: KibanaRequest) { if (isESOUsingEphemeralEncryptionKey === true) { diff --git a/x-pack/plugins/alerting/server/task_runner/create_execution_handler.test.ts b/x-pack/plugins/alerting/server/task_runner/create_execution_handler.test.ts index 756080baba626..0e46ef4919626 100644 --- a/x-pack/plugins/alerting/server/task_runner/create_execution_handler.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/create_execution_handler.test.ts @@ -51,6 +51,7 @@ const createExecutionHandlerParams = { beforeEach(() => { jest.resetAllMocks(); createExecutionHandlerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue(true); + createExecutionHandlerParams.actionsPlugin.isActionExecutable.mockReturnValue(true); }); test('calls actionsPlugin.execute per selected action', async () => { @@ -111,6 +112,7 @@ test('calls actionsPlugin.execute per selected action', async () => { test(`doesn't call actionsPlugin.execute for disabled actionTypes`, async () => { // Mock two calls, one for check against actions[0] and the second for actions[1] + createExecutionHandlerParams.actionsPlugin.isActionExecutable.mockReturnValueOnce(false); createExecutionHandlerParams.actionsPlugin.isActionTypeEnabled.mockReturnValueOnce(false); createExecutionHandlerParams.actionsPlugin.isActionTypeEnabled.mockReturnValueOnce(true); const executionHandler = createExecutionHandler({ @@ -148,6 +150,50 @@ test(`doesn't call actionsPlugin.execute for disabled actionTypes`, async () => }); }); +test('trow error error message when action type is disabled', async () => { + createExecutionHandlerParams.actionsPlugin.preconfiguredActions = []; + createExecutionHandlerParams.actionsPlugin.isActionExecutable.mockReturnValue(false); + createExecutionHandlerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue(false); + const executionHandler = createExecutionHandler({ + ...createExecutionHandlerParams, + actions: [ + ...createExecutionHandlerParams.actions, + { + id: '2', + group: 'default', + actionTypeId: '.slack', + params: { + foo: true, + contextVal: 'My other {{context.value}} goes here', + stateVal: 'My other {{state.value}} goes here', + }, + }, + ], + }); + + await executionHandler({ + actionGroup: 'default', + state: {}, + context: {}, + alertInstanceId: '2', + }); + + expect(createExecutionHandlerParams.actionsPlugin.execute).toHaveBeenCalledTimes(0); + + createExecutionHandlerParams.actionsPlugin.isActionExecutable.mockImplementation(() => true); + const executionHandlerForPreconfiguredAction = createExecutionHandler({ + ...createExecutionHandlerParams, + actions: [...createExecutionHandlerParams.actions], + }); + await executionHandlerForPreconfiguredAction({ + actionGroup: 'default', + state: {}, + context: {}, + alertInstanceId: '2', + }); + expect(createExecutionHandlerParams.actionsPlugin.execute).toHaveBeenCalledTimes(1); +}); + test('limits actionsPlugin.execute per action group', async () => { const executionHandler = createExecutionHandler(createExecutionHandlerParams); await executionHandler({ diff --git a/x-pack/plugins/alerting/server/task_runner/create_execution_handler.ts b/x-pack/plugins/alerting/server/task_runner/create_execution_handler.ts index 72f9e70905dc2..5c3e36b88879d 100644 --- a/x-pack/plugins/alerting/server/task_runner/create_execution_handler.ts +++ b/x-pack/plugins/alerting/server/task_runner/create_execution_handler.ts @@ -71,7 +71,7 @@ export function createExecutionHandler({ const alertLabel = `${alertType.id}:${alertId}: '${alertName}'`; for (const action of actions) { - if (!actionsPlugin.isActionTypeEnabled(action.actionTypeId)) { + if (!actionsPlugin.isActionExecutable(action.id, action.actionTypeId)) { logger.warn( `Alert "${alertId}" skipped scheduling action "${action.id}" because it is disabled` ); diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts index 31cc893f785cb..0f600c7df7bf7 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts @@ -185,6 +185,7 @@ describe('Task Runner', () => { test('actionsPlugin.execute is called per alert instance that is scheduled', async () => { taskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue(true); + taskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue(true); alertType.executor.mockImplementation( ({ services: executorServices }: AlertExecutorOptions) => { executorServices.alertInstanceFactory('1').scheduleActions('default'); diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 19d43870f4673..712ceffaef6ed 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -15943,7 +15943,6 @@ "xpack.triggersActionsUI.sections.alertForm.loadingActionTypesDescription": "アクションタイプを読み込み中...", "xpack.triggersActionsUI.sections.alertForm.renotifyFieldLabel": "通知間隔", "xpack.triggersActionsUI.sections.alertForm.renotifyWithTooltip": "アラートがアクティブな間にアクションを繰り返す頻度を定義します。", - "xpack.triggersActionsUI.sections.alertForm.selectAlertActionTypeEditTitle": "{actionConnectorName}", "xpack.triggersActionsUI.sections.alertForm.selectAlertActionTypeTitle": "アクション:アクションタイプを選択してください", "xpack.triggersActionsUI.sections.alertForm.selectAlertTypeTitle": "トリガータイプを選択してください", "xpack.triggersActionsUI.sections.alertForm.selectedAlertTypeTitle": "{alertType}", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 9875b66e425f8..7358b381ca7a2 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -15948,7 +15948,6 @@ "xpack.triggersActionsUI.sections.alertForm.loadingActionTypesDescription": "正在加载操作类型……", "xpack.triggersActionsUI.sections.alertForm.renotifyFieldLabel": "通知频率", "xpack.triggersActionsUI.sections.alertForm.renotifyWithTooltip": "定义告警处于活动状态时重复操作的频率。", - "xpack.triggersActionsUI.sections.alertForm.selectAlertActionTypeEditTitle": "{actionConnectorName}", "xpack.triggersActionsUI.sections.alertForm.selectAlertActionTypeTitle": "操作:选择操作类型", "xpack.triggersActionsUI.sections.alertForm.selectAlertTypeTitle": "选择触发器类型", "xpack.triggersActionsUI.sections.alertForm.selectedAlertTypeTitle": "{alertType}", diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/action_type_compare.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/action_type_compare.test.ts index 9ce50cf47560a..0a2ec3f203a9a 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/action_type_compare.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/action_type_compare.test.ts @@ -33,11 +33,20 @@ test('should sort enabled action types first', async () => { enabledInConfig: true, enabledInLicense: true, }, + { + id: '4', + minimumLicenseRequired: 'basic', + name: 'x-fourth', + enabled: true, + enabledInConfig: false, + enabledInLicense: true, + }, ]; const result = [...actionTypes].sort(actionTypeCompare); expect(result[0]).toEqual(actionTypes[0]); expect(result[1]).toEqual(actionTypes[2]); - expect(result[2]).toEqual(actionTypes[1]); + expect(result[2]).toEqual(actionTypes[3]); + expect(result[3]).toEqual(actionTypes[1]); }); test('should sort by name when all enabled', async () => { @@ -66,9 +75,18 @@ test('should sort by name when all enabled', async () => { enabledInConfig: true, enabledInLicense: true, }, + { + id: '4', + minimumLicenseRequired: 'basic', + name: 'x-fourth', + enabled: true, + enabledInConfig: false, + enabledInLicense: true, + }, ]; const result = [...actionTypes].sort(actionTypeCompare); expect(result[0]).toEqual(actionTypes[1]); expect(result[1]).toEqual(actionTypes[2]); expect(result[2]).toEqual(actionTypes[0]); + expect(result[3]).toEqual(actionTypes[3]); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/action_type_compare.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/action_type_compare.ts index d18cb21b3a0fe..8078ef4938e50 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/action_type_compare.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/action_type_compare.ts @@ -4,14 +4,35 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ActionType } from '../../types'; +import { ActionType, ActionConnector } from '../../types'; -export function actionTypeCompare(a: ActionType, b: ActionType) { - if (a.enabled === true && b.enabled === false) { +export function actionTypeCompare( + a: ActionType, + b: ActionType, + preconfiguredConnectors?: ActionConnector[] +) { + const aEnabled = getIsEnabledValue(a, preconfiguredConnectors); + const bEnabled = getIsEnabledValue(b, preconfiguredConnectors); + + if (aEnabled === true && bEnabled === false) { return -1; } - if (a.enabled === false && b.enabled === true) { + if (aEnabled === false && bEnabled === true) { return 1; } return a.name.localeCompare(b.name); } + +const getIsEnabledValue = (actionType: ActionType, preconfiguredConnectors?: ActionConnector[]) => { + let isEnabled = actionType.enabled; + if ( + !actionType.enabledInConfig && + preconfiguredConnectors && + preconfiguredConnectors.length > 0 + ) { + isEnabled = + preconfiguredConnectors.find(connector => connector.actionTypeId === actionType.id) !== + undefined; + } + return isEnabled; +}; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/check_action_type_enabled.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/lib/check_action_type_enabled.test.tsx index 566ed7935e013..9c017aa6fd31f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/check_action_type_enabled.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/check_action_type_enabled.test.tsx @@ -4,43 +4,47 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ActionType } from '../../types'; -import { checkActionTypeEnabled } from './check_action_type_enabled'; +import { ActionType, ActionConnector } from '../../types'; +import { + checkActionTypeEnabled, + checkActionFormActionTypeEnabled, +} from './check_action_type_enabled'; -test(`returns isEnabled:true when action type isn't provided`, async () => { - expect(checkActionTypeEnabled()).toMatchInlineSnapshot(` +describe('checkActionTypeEnabled', () => { + test(`returns isEnabled:true when action type isn't provided`, async () => { + expect(checkActionTypeEnabled()).toMatchInlineSnapshot(` Object { "isEnabled": true, } `); -}); + }); -test('returns isEnabled:true when action type is enabled', async () => { - const actionType: ActionType = { - id: '1', - minimumLicenseRequired: 'basic', - name: 'my action', - enabled: true, - enabledInConfig: true, - enabledInLicense: true, - }; - expect(checkActionTypeEnabled(actionType)).toMatchInlineSnapshot(` + test('returns isEnabled:true when action type is enabled', async () => { + const actionType: ActionType = { + id: '1', + minimumLicenseRequired: 'basic', + name: 'my action', + enabled: true, + enabledInConfig: true, + enabledInLicense: true, + }; + expect(checkActionTypeEnabled(actionType)).toMatchInlineSnapshot(` Object { "isEnabled": true, } `); -}); + }); -test('returns isEnabled:false when action type is disabled by license', async () => { - const actionType: ActionType = { - id: '1', - minimumLicenseRequired: 'basic', - name: 'my action', - enabled: false, - enabledInConfig: true, - enabledInLicense: false, - }; - expect(checkActionTypeEnabled(actionType)).toMatchInlineSnapshot(` + test('returns isEnabled:false when action type is disabled by license', async () => { + const actionType: ActionType = { + id: '1', + minimumLicenseRequired: 'basic', + name: 'my action', + enabled: false, + enabledInConfig: true, + enabledInLicense: false, + }; + expect(checkActionTypeEnabled(actionType)).toMatchInlineSnapshot(` Object { "isEnabled": false, "message": "This connector requires a Basic license.", @@ -63,18 +67,82 @@ test('returns isEnabled:false when action type is disabled by license', async () , } `); + }); + + test('returns isEnabled:false when action type is disabled by config', async () => { + const actionType: ActionType = { + id: '1', + minimumLicenseRequired: 'basic', + name: 'my action', + enabled: false, + enabledInConfig: false, + enabledInLicense: true, + }; + expect(checkActionTypeEnabled(actionType)).toMatchInlineSnapshot(` + Object { + "isEnabled": false, + "message": "This connector is disabled by the Kibana configuration.", + "messageCard": , + } + `); + }); }); -test('returns isEnabled:false when action type is disabled by config', async () => { - const actionType: ActionType = { - id: '1', - minimumLicenseRequired: 'basic', - name: 'my action', - enabled: false, - enabledInConfig: false, - enabledInLicense: true, - }; - expect(checkActionTypeEnabled(actionType)).toMatchInlineSnapshot(` +describe('checkActionFormActionTypeEnabled', () => { + const preconfiguredConnectors: ActionConnector[] = [ + { + actionTypeId: '1', + config: {}, + id: 'test1', + isPreconfigured: true, + name: 'test', + secrets: {}, + referencedByCount: 0, + }, + { + actionTypeId: '2', + config: {}, + id: 'test2', + isPreconfigured: true, + name: 'test', + secrets: {}, + referencedByCount: 0, + }, + ]; + + test('returns isEnabled:true when action type is preconfigured', async () => { + const actionType: ActionType = { + id: '1', + minimumLicenseRequired: 'basic', + name: 'my action', + enabled: true, + enabledInConfig: false, + enabledInLicense: true, + }; + + expect(checkActionFormActionTypeEnabled(actionType, preconfiguredConnectors)) + .toMatchInlineSnapshot(` + Object { + "isEnabled": true, + } + `); + }); + + test('returns isEnabled:false when action type is disabled by config and not preconfigured', async () => { + const actionType: ActionType = { + id: 'disabled-by-config', + minimumLicenseRequired: 'basic', + name: 'my action', + enabled: true, + enabledInConfig: false, + enabledInLicense: true, + }; + expect(checkActionFormActionTypeEnabled(actionType, preconfiguredConnectors)) + .toMatchInlineSnapshot(` Object { "isEnabled": false, "message": "This connector is disabled by the Kibana configuration.", @@ -85,4 +153,5 @@ test('returns isEnabled:false when action type is disabled by config', async () />, } `); + }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/check_action_type_enabled.tsx b/x-pack/plugins/triggers_actions_ui/public/application/lib/check_action_type_enabled.tsx index 263502a82ec79..971d6dbbb57bf 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/check_action_type_enabled.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/check_action_type_enabled.tsx @@ -9,7 +9,7 @@ import { capitalize } from 'lodash'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiCard, EuiLink } from '@elastic/eui'; -import { ActionType } from '../../types'; +import { ActionType, ActionConnector } from '../../types'; import { VIEW_LICENSE_OPTIONS_LINK } from '../../common/constants'; import './check_action_type_enabled.scss'; @@ -22,71 +22,98 @@ export interface IsDisabledResult { messageCard: JSX.Element; } +const getLicenseCheckResult = (actionType: ActionType) => { + return { + isEnabled: false, + message: i18n.translate( + 'xpack.triggersActionsUI.checkActionTypeEnabled.actionTypeDisabledByLicenseMessage', + { + defaultMessage: 'This connector requires a {minimumLicenseRequired} license.', + values: { + minimumLicenseRequired: capitalize(actionType.minimumLicenseRequired), + }, + } + ), + messageCard: ( + + + + } + /> + ), + }; +}; + +const configurationCheckResult = { + isEnabled: false, + message: i18n.translate( + 'xpack.triggersActionsUI.checkActionTypeEnabled.actionTypeDisabledByConfigMessage', + { defaultMessage: 'This connector is disabled by the Kibana configuration.' } + ), + messageCard: ( + + ), +}; + export function checkActionTypeEnabled( actionType?: ActionType ): IsEnabledResult | IsDisabledResult { if (actionType?.enabledInLicense === false) { - return { - isEnabled: false, - message: i18n.translate( - 'xpack.triggersActionsUI.checkActionTypeEnabled.actionTypeDisabledByLicenseMessage', - { - defaultMessage: 'This connector requires a {minimumLicenseRequired} license.', - values: { - minimumLicenseRequired: capitalize(actionType.minimumLicenseRequired), - }, - } - ), - messageCard: ( - - - - } - /> - ), - }; + return getLicenseCheckResult(actionType); } if (actionType?.enabledInConfig === false) { - return { - isEnabled: false, - message: i18n.translate( - 'xpack.triggersActionsUI.checkActionTypeEnabled.actionTypeDisabledByConfigMessage', - { defaultMessage: 'This connector is disabled by the Kibana configuration.' } - ), - messageCard: ( - - ), - }; + return configurationCheckResult; + } + + return { isEnabled: true }; +} + +export function checkActionFormActionTypeEnabled( + actionType: ActionType, + preconfiguredConnectors: ActionConnector[] +): IsEnabledResult | IsDisabledResult { + if (actionType?.enabledInLicense === false) { + return getLicenseCheckResult(actionType); + } + + if ( + actionType?.enabledInConfig === false && + // do not disable action type if it contains preconfigured connectors (is preconfigured) + !preconfiguredConnectors.find( + preconfiguredConnector => preconfiguredConnector.actionTypeId === actionType.id + ) + ) { + return configurationCheckResult; } return { isEnabled: true }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.test.tsx index d4def86b07b1f..aed7d18bd9f3d 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.test.tsx @@ -73,6 +73,21 @@ describe('action_form', () => { actionParamsFields: null, }; + const preconfiguredOnly = { + id: 'preconfigured', + iconClass: 'test', + selectMessage: 'test', + validateConnector: (): ValidationResult => { + return { errors: {} }; + }, + validateParams: (): ValidationResult => { + const validationResult = { errors: {} }; + return validationResult; + }, + actionConnectorFields: null, + actionParamsFields: null, + }; + describe('action_form in alert', () => { let wrapper: ReactWrapper; @@ -95,6 +110,22 @@ describe('action_form', () => { config: {}, isPreconfigured: true, }, + { + secrets: {}, + id: 'test3', + actionTypeId: preconfiguredOnly.id, + name: 'Preconfigured Only', + config: {}, + isPreconfigured: true, + }, + { + secrets: {}, + id: 'test4', + actionTypeId: preconfiguredOnly.id, + name: 'Regular connector', + config: {}, + isPreconfigured: false, + }, ]); const mockes = coreMock.createSetup(); deps = { @@ -106,6 +137,7 @@ describe('action_form', () => { actionType, disabledByConfigActionType, disabledByLicenseActionType, + preconfiguredOnly, ]); actionTypeRegistry.has.mockReturnValue(true); actionTypeRegistry.get.mockReturnValue(actionType); @@ -166,6 +198,14 @@ describe('action_form', () => { enabledInLicense: true, minimumLicenseRequired: 'basic', }, + { + id: 'preconfigured', + name: 'Preconfigured only', + enabled: true, + enabledInConfig: false, + enabledInLicense: true, + minimumLicenseRequired: 'basic', + }, { id: 'disabled-by-config', name: 'Disabled by config', @@ -207,21 +247,27 @@ describe('action_form', () => { ).toBeFalsy(); }); - it(`doesn't render action types disabled by config`, async () => { + it('does not render action types disabled by config', async () => { await setup(); const actionOption = wrapper.find( - `[data-test-subj="disabled-by-config-ActionTypeSelectOption"]` + '[data-test-subj="disabled-by-config-ActionTypeSelectOption"]' ); expect(actionOption.exists()).toBeFalsy(); }); - it(`renders available connectors for the selected action type`, async () => { + it('render action types which is preconfigured only (disabled by config and with preconfigured connectors)', async () => { + await setup(); + const actionOption = wrapper.find('[data-test-subj="preconfigured-ActionTypeSelectOption"]'); + expect(actionOption.exists()).toBeTruthy(); + }); + + it('renders available connectors for the selected action type', async () => { await setup(); const actionOption = wrapper.find( `[data-test-subj="${actionType.id}-ActionTypeSelectOption"]` ); actionOption.first().simulate('click'); - const combobox = wrapper.find(`[data-test-subj="selectActionConnector"]`); + const combobox = wrapper.find(`[data-test-subj="selectActionConnector-${actionType.id}"]`); expect((combobox.first().props() as any).options).toMatchInlineSnapshot(` Array [ Object { @@ -238,10 +284,37 @@ describe('action_form', () => { `); }); + it('renders only preconfigured connectors for the selected preconfigured action type', async () => { + await setup(); + const actionOption = wrapper.find('[data-test-subj="preconfigured-ActionTypeSelectOption"]'); + actionOption.first().simulate('click'); + const combobox = wrapper.find('[data-test-subj="selectActionConnector-preconfigured"]'); + expect((combobox.first().props() as any).options).toMatchInlineSnapshot(` + Array [ + Object { + "id": "test3", + "key": "test3", + "label": "Preconfigured Only (preconfigured)", + }, + ] + `); + }); + + it('does not render "Add new" button for preconfigured only action type', async () => { + await setup(); + const actionOption = wrapper.find('[data-test-subj="preconfigured-ActionTypeSelectOption"]'); + actionOption.first().simulate('click'); + const preconfigPannel = wrapper.find('[data-test-subj="alertActionAccordion-default"]'); + const addNewConnectorButton = preconfigPannel.find( + '[data-test-subj="addNewActionConnectorButton-preconfigured"]' + ); + expect(addNewConnectorButton.exists()).toBeFalsy(); + }); + it('renders action types disabled by license', async () => { await setup(); const actionOption = wrapper.find( - `[data-test-subj="disabled-by-license-ActionTypeSelectOption"]` + '[data-test-subj="disabled-by-license-ActionTypeSelectOption"]' ); expect(actionOption.exists()).toBeTruthy(); expect( diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx index 4199cfb7b4b7f..0027837c913d1 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx @@ -29,7 +29,7 @@ import { EuiText, } from '@elastic/eui'; import { HttpSetup, ToastsApi } from 'kibana/public'; -import { loadActionTypes, loadAllActions } from '../../lib/action_connector_api'; +import { loadActionTypes, loadAllActions as loadConnectors } from '../../lib/action_connector_api'; import { IErrorObject, ActionTypeModel, @@ -42,7 +42,7 @@ import { SectionLoading } from '../../components/section_loading'; import { ConnectorAddModal } from './connector_add_modal'; import { TypeRegistry } from '../../type_registry'; import { actionTypeCompare } from '../../lib/action_type_compare'; -import { checkActionTypeEnabled } from '../../lib/check_action_type_enabled'; +import { checkActionFormActionTypeEnabled } from '../../lib/check_action_type_enabled'; import { VIEW_LICENSE_OPTIONS_LINK } from '../../../common/constants'; interface ActionAccordionFormProps { @@ -111,14 +111,12 @@ export const ActionForm = ({ setHasActionsDisabled(hasActionsDisabled); } } catch (e) { - if (toastNotifications) { - toastNotifications.addDanger({ - title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertForm.unableToLoadActionTypesMessage', - { defaultMessage: 'Unable to load action types' } - ), - }); - } + toastNotifications.addDanger({ + title: i18n.translate( + 'xpack.triggersActionsUI.sections.alertForm.unableToLoadActionTypesMessage', + { defaultMessage: 'Unable to load action types' } + ), + }); } finally { setIsLoadingActionTypes(false); } @@ -126,41 +124,50 @@ export const ActionForm = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + // load connectors useEffect(() => { - loadConnectors(); + (async () => { + try { + setIsLoadingConnectors(true); + setConnectors(await loadConnectors({ http })); + } catch (e) { + toastNotifications.addDanger({ + title: i18n.translate( + 'xpack.triggersActionsUI.sections.alertForm.unableToLoadActionsMessage', + { + defaultMessage: 'Unable to load connectors', + } + ), + }); + } finally { + setIsLoadingConnectors(false); + } + })(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - async function loadConnectors() { - try { - setIsLoadingConnectors(true); - const actionsResponse = await loadAllActions({ http }); - setConnectors(actionsResponse); - } catch (e) { - toastNotifications.addDanger({ - title: i18n.translate( - 'xpack.triggersActionsUI.sections.alertForm.unableToLoadActionsMessage', - { - defaultMessage: 'Unable to load connectors', - } - ), - }); - } finally { - setIsLoadingConnectors(false); - } - } const preconfiguredMessage = i18n.translate( 'xpack.triggersActionsUI.sections.actionForm.preconfiguredTitleMessage', { defaultMessage: '(preconfigured)', } ); + const getSelectedOptions = (actionItemId: string) => { - const val = connectors.find(connector => connector.id === actionItemId); - if (!val) { + const selectedConnector = connectors.find(connector => connector.id === actionItemId); + if ( + !selectedConnector || + // if selected connector is not preconfigured and action type is for preconfiguration only, + // do not show regular connectors of this type + (actionTypesIndex && + !actionTypesIndex[selectedConnector.actionTypeId].enabledInConfig && + !selectedConnector.isPreconfigured) + ) { return []; } - const optionTitle = `${val.name} ${val.isPreconfigured ? preconfiguredMessage : ''}`; + const optionTitle = `${selectedConnector.name} ${ + selectedConnector.isPreconfigured ? preconfiguredMessage : '' + }`; return [ { label: optionTitle, @@ -179,8 +186,15 @@ export const ActionForm = ({ }, index: number ) => { + const actionType = actionTypesIndex![actionItem.actionTypeId]; + const optionsList = connectors - .filter(connectorItem => connectorItem.actionTypeId === actionItem.actionTypeId) + .filter( + connectorItem => + connectorItem.actionTypeId === actionItem.actionTypeId && + // include only enabled by config connectors or preconfigured + (actionType.enabledInConfig || connectorItem.isPreconfigured) + ) .map(({ name, id, isPreconfigured }) => ({ label: `${name} ${isPreconfigured ? preconfiguredMessage : ''}`, key: id, @@ -189,8 +203,9 @@ export const ActionForm = ({ const actionTypeRegistered = actionTypeRegistry.get(actionConnector.actionTypeId); if (!actionTypeRegistered || actionItem.group !== defaultActionGroupId) return null; const ParamsFieldsComponent = actionTypeRegistered.actionParamsFields; - const checkEnabledResult = checkActionTypeEnabled( - actionTypesIndex && actionTypesIndex[actionConnector.actionTypeId] + const checkEnabledResult = checkActionFormActionTypeEnabled( + actionTypesIndex![actionConnector.actionTypeId], + connectors.filter(connector => connector.isPreconfigured) ); const accordionContent = checkEnabledResult.isEnabled ? ( @@ -211,19 +226,21 @@ export const ActionForm = ({ /> } labelAppend={ - { - setActiveActionItem({ actionTypeId: actionItem.actionTypeId, index }); - setAddModalVisibility(true); - }} - > - - + actionTypesIndex![actionConnector.actionTypeId].enabledInConfig ? ( + { + setActiveActionItem({ actionTypeId: actionItem.actionTypeId, index }); + setAddModalVisibility(true); + }} + > + + + ) : null } > { setActionIdByIndex(selectedOptions[0].id ?? '', index); @@ -258,10 +275,9 @@ export const ActionForm = ({ ); return ( - + -

+

@@ -349,10 +365,9 @@ export const ActionForm = ({ const actionTypeRegistered = actionTypeRegistry.get(actionItem.actionTypeId); if (!actionTypeRegistered || actionItem.group !== defaultActionGroupId) return null; return ( - + -

+

-

+
@@ -486,18 +501,26 @@ export const ActionForm = ({ } } - let actionTypeNodes: JSX.Element[] | null = null; + let actionTypeNodes: Array | null = null; let hasDisabledByLicenseActionTypes = false; if (actionTypesIndex) { + const preconfiguredConnectors = connectors.filter(connector => connector.isPreconfigured); actionTypeNodes = actionTypeRegistry .list() - .filter( - item => actionTypesIndex[item.id] && actionTypesIndex[item.id].enabledInConfig === true + .filter(item => actionTypesIndex[item.id]) + .sort((a, b) => + actionTypeCompare(actionTypesIndex[a.id], actionTypesIndex[b.id], preconfiguredConnectors) ) - .sort((a, b) => actionTypeCompare(actionTypesIndex[a.id], actionTypesIndex[b.id])) .map(function(item, index) { const actionType = actionTypesIndex[item.id]; - const checkEnabledResult = checkActionTypeEnabled(actionTypesIndex[item.id]); + const checkEnabledResult = checkActionFormActionTypeEnabled( + actionTypesIndex[item.id], + preconfiguredConnectors + ); + // if action type is not enabled in config and not preconfigured, it shouldn't be displayed + if (!actionType.enabledInConfig && !checkEnabledResult.isEnabled) { + return null; + } if (!actionType.enabledInLicense) { hasDisabledByLicenseActionTypes = true; } diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts index bbf8881f0c62a..597f1ad9119b0 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts @@ -68,7 +68,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await nameInput.click(); await testSubjects.click('.slack-ActionTypeSelectOption'); - await testSubjects.click('createActionConnectorButton'); + await testSubjects.click('addNewActionConnectorButton-.slack'); const slackConnectorName = generateUniqueKey(); await testSubjects.setValue('nameInput', slackConnectorName); await testSubjects.setValue('slackWebhookUrlInput', 'https://test'); From 3a898a159c2cd650c045320733a440dce49650e0 Mon Sep 17 00:00:00 2001 From: Nick Partridge Date: Fri, 24 Apr 2020 17:47:59 -0500 Subject: [PATCH 08/26] update charts library to 18.4.2 (#64438) --- package.json | 2 +- packages/kbn-ui-shared-deps/package.json | 2 +- yarn.lock | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 956ad9ee4f71d..ece6b5f4bc8f7 100644 --- a/package.json +++ b/package.json @@ -120,7 +120,7 @@ "@babel/core": "^7.9.0", "@babel/register": "^7.9.0", "@elastic/apm-rum": "^5.1.1", - "@elastic/charts": "18.4.1", + "@elastic/charts": "18.4.2", "@elastic/datemath": "5.0.3", "@elastic/ems-client": "7.8.0", "@elastic/eui": "22.3.0", diff --git a/packages/kbn-ui-shared-deps/package.json b/packages/kbn-ui-shared-deps/package.json index 46f55da87575d..a60e2b0449d95 100644 --- a/packages/kbn-ui-shared-deps/package.json +++ b/packages/kbn-ui-shared-deps/package.json @@ -9,7 +9,7 @@ "kbn:watch": "node scripts/build --watch" }, "dependencies": { - "@elastic/charts": "18.4.1", + "@elastic/charts": "18.4.2", "@elastic/eui": "22.3.0", "@kbn/i18n": "1.0.0", "abortcontroller-polyfill": "^1.4.0", diff --git a/yarn.lock b/yarn.lock index b9f80cd5923b7..9e05b1dcfcdbb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1236,10 +1236,10 @@ dependencies: "@elastic/apm-rum-core" "^5.2.0" -"@elastic/charts@18.4.1": - version "18.4.1" - resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-18.4.1.tgz#19d82c39aef347fd00b33e33b68b683ac4d745b0" - integrity sha512-vV5AAKIKbwgY923OD2Rsr77XFHmsUsWWg/aeCZvG5/b6Yb+fNgM0RF94GADiDMvRvQANhTn2CPPVvNfL18MegQ== +"@elastic/charts@18.4.2": + version "18.4.2" + resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-18.4.2.tgz#7d3c40dca8a7a701fb7227382191b84d36d8b32a" + integrity sha512-fmEDRUeFEtVWGurafhp/5bHBypOjdXiRXY074tCqnez43hA2iA4v1KrZL8tPFlMePgc/kpZf9wb8aEwxlfWumw== dependencies: classnames "^2.2.6" d3-array "^1.2.4" From 0c8cfa2672fc4e39e6cf0ac51bad2ea03a10dfd8 Mon Sep 17 00:00:00 2001 From: Aaron Caldwell Date: Fri, 24 Apr 2020 20:16:34 -0600 Subject: [PATCH 09/26] [Maps] Include maps styles in embeddables factory so that they're bundled w/ consuming plugins (#64460) --- x-pack/plugins/maps/public/embeddable/map_embeddable_factory.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/maps/public/embeddable/map_embeddable_factory.ts b/x-pack/plugins/maps/public/embeddable/map_embeddable_factory.ts index be6c3bf978d82..abfaba80c33d1 100644 --- a/x-pack/plugins/maps/public/embeddable/map_embeddable_factory.ts +++ b/x-pack/plugins/maps/public/embeddable/map_embeddable_factory.ts @@ -23,6 +23,7 @@ import { addLayerWithoutDataSync } from '../actions/map_actions'; import { getQueryableUniqueIndexPatternIds } from '../selectors/map_selectors'; import { getInitialLayers } from '../angular/get_initial_layers'; import { mergeInputWithSavedMap } from './merge_input_with_saved_map'; +import '../index.scss'; export class MapEmbeddableFactory implements EmbeddableFactoryDefinition { type = MAP_SAVED_OBJECT_TYPE; From 387c581e9b94d6cc3b6476413966ea7ba56038bc Mon Sep 17 00:00:00 2001 From: spalger Date: Sat, 25 Apr 2020 10:54:48 -0700 Subject: [PATCH 10/26] disable flaky suite (#64382) (#64381) (#64480) --- src/core/public/application/integration_tests/router.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/public/application/integration_tests/router.test.tsx b/src/core/public/application/integration_tests/router.test.tsx index 2f26bc1409104..ceda06f55ec30 100644 --- a/src/core/public/application/integration_tests/router.test.tsx +++ b/src/core/public/application/integration_tests/router.test.tsx @@ -27,7 +27,8 @@ import { createRenderer, createAppMounter, createLegacyAppMounter, getUnmounter import { AppStatus } from '../types'; import { ScopedHistory } from '../scoped_history'; -describe('AppContainer', () => { +// FLAKY: https://github.com/elastic/kibana/issues/64382 +describe.skip('AppContainer', () => { let mounters: MockedMounterMap; let globalHistory: History; let appStatuses$: BehaviorSubject>; From 341ad77d2becf324e99fe7a3505aa4d3adb7b43b Mon Sep 17 00:00:00 2001 From: spalger Date: Sat, 25 Apr 2020 10:58:22 -0700 Subject: [PATCH 11/26] skip flaky suite (#64310) --- src/core/server/http/integration_tests/core_services.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/server/http/integration_tests/core_services.test.ts b/src/core/server/http/integration_tests/core_services.test.ts index 7b1630a7de0be..606bc592587cc 100644 --- a/src/core/server/http/integration_tests/core_services.test.ts +++ b/src/core/server/http/integration_tests/core_services.test.ts @@ -39,7 +39,8 @@ const cookieOptions = { isSecure: false, }; -describe('http service', () => { +// FLAKY: https://github.com/elastic/kibana/issues/64310 +describe.skip('http service', () => { describe('auth', () => { let root: ReturnType; beforeEach(async () => { From 2746ca85ec2845369c14dfbc0ef10ecb035c4f91 Mon Sep 17 00:00:00 2001 From: spalger Date: Sat, 25 Apr 2020 22:03:54 -0700 Subject: [PATCH 12/26] Revert "skip flaky suite (#64310)" This reverts commit 341ad77d2becf324e99fe7a3505aa4d3adb7b43b. --- src/core/server/http/integration_tests/core_services.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/server/http/integration_tests/core_services.test.ts b/src/core/server/http/integration_tests/core_services.test.ts index 606bc592587cc..7b1630a7de0be 100644 --- a/src/core/server/http/integration_tests/core_services.test.ts +++ b/src/core/server/http/integration_tests/core_services.test.ts @@ -39,8 +39,7 @@ const cookieOptions = { isSecure: false, }; -// FLAKY: https://github.com/elastic/kibana/issues/64310 -describe.skip('http service', () => { +describe('http service', () => { describe('auth', () => { let root: ReturnType; beforeEach(async () => { From ac2c239e8d172c2fb109e7d004cf0a08e416ee62 Mon Sep 17 00:00:00 2001 From: spalger Date: Sat, 25 Apr 2020 22:04:01 -0700 Subject: [PATCH 13/26] Revert "disable flaky suite (#64382) (#64381) (#64480)" This reverts commit 387c581e9b94d6cc3b6476413966ea7ba56038bc. --- src/core/public/application/integration_tests/router.test.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/public/application/integration_tests/router.test.tsx b/src/core/public/application/integration_tests/router.test.tsx index ceda06f55ec30..2f26bc1409104 100644 --- a/src/core/public/application/integration_tests/router.test.tsx +++ b/src/core/public/application/integration_tests/router.test.tsx @@ -27,8 +27,7 @@ import { createRenderer, createAppMounter, createLegacyAppMounter, getUnmounter import { AppStatus } from '../types'; import { ScopedHistory } from '../scoped_history'; -// FLAKY: https://github.com/elastic/kibana/issues/64382 -describe.skip('AppContainer', () => { +describe('AppContainer', () => { let mounters: MockedMounterMap; let globalHistory: History; let appStatuses$: BehaviorSubject>; From 9eca4026f98a533b269bef187f2785bf32b1998e Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Mon, 27 Apr 2020 08:35:56 +0200 Subject: [PATCH 14/26] Bump iedriver dev-dependency from 3.14.1 to 3.14.2 (#64406) --- package.json | 2 +- yarn.lock | 73 ++++++++++++++++------------------------------------ 2 files changed, 23 insertions(+), 52 deletions(-) diff --git a/package.json b/package.json index ece6b5f4bc8f7..e8633f5a138fb 100644 --- a/package.json +++ b/package.json @@ -441,7 +441,7 @@ "gulp-babel": "^8.0.0", "gulp-sourcemaps": "2.6.5", "has-ansi": "^3.0.0", - "iedriver": "^3.14.1", + "iedriver": "^3.14.2", "intl-messageformat-parser": "^1.4.0", "is-path-inside": "^2.1.0", "istanbul-instrumenter-loader": "3.0.1", diff --git a/yarn.lock b/yarn.lock index 9e05b1dcfcdbb..8653d62ef5120 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5506,11 +5506,6 @@ adm-zip@0.4.11: resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.11.tgz#2aa54c84c4b01a9d0fb89bb11982a51f13e3d62a" integrity sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA== -adm-zip@^0.4.13: - version "0.4.13" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.13.tgz#597e2f8cc3672151e1307d3e95cddbc75672314a" - integrity sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw== - affine-hull@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/affine-hull/-/affine-hull-1.0.0.tgz#763ff1d38d063ceb7e272f17ee4d7bbcaf905c5d" @@ -9479,15 +9474,6 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.0, concat-stream@^1.4.7, concat-stream@~1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc= - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - concat-stream@1.6.2, concat-stream@^1.4.6, concat-stream@^1.5.0, concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" @@ -9498,6 +9484,15 @@ concat-stream@1.6.2, concat-stream@^1.4.6, concat-stream@^1.5.0, concat-stream@^ readable-stream "^2.2.2" typedarray "^0.0.6" +concat-stream@^1.4.7, concat-stream@~1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc= + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + concat-stream@~1.5.0: version "1.5.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266" @@ -13243,16 +13238,6 @@ extract-stack@^1.0.0: resolved "https://registry.yarnpkg.com/extract-stack/-/extract-stack-1.0.0.tgz#b97acaf9441eea2332529624b732fc5a1c8165fa" integrity sha1-uXrK+UQe6iMyUpYktzL8WhyBZfo= -extract-zip@1.6.6: - version "1.6.6" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.6.tgz#1290ede8d20d0872b429fd3f351ca128ec5ef85c" - integrity sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw= - dependencies: - concat-stream "1.6.0" - debug "2.6.9" - mkdirp "0.5.0" - yauzl "2.4.1" - extract-zip@1.6.7: version "1.6.7" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" @@ -13263,7 +13248,7 @@ extract-zip@1.6.7: mkdirp "0.5.1" yauzl "2.4.1" -extract-zip@^1.6.6, extract-zip@^1.7.0: +extract-zip@1.7.0, extract-zip@^1.6.6, extract-zip@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== @@ -16377,16 +16362,14 @@ idx@^2.5.6: resolved "https://registry.yarnpkg.com/idx/-/idx-2.5.6.tgz#1f824595070100ae9ad585c86db08dc74f83a59d" integrity sha512-WFXLF7JgPytbMgelpRY46nHz5tyDcedJ76pLV+RJWdb8h33bxFq4bdZau38DhNSzk5eVniBf1K3jwfK+Lb5nYA== -iedriver@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/iedriver/-/iedriver-3.14.1.tgz#447c49be83c62d3f2f158283d58ccf7b35002be8" - integrity sha512-YyCi703BGK7R37A8QlSe2B87xgwDGGoPqBrlXe4Q68o/MNLJrR53/IpTs6J1+KKk51MLiTbWa57N7P3KZ11tow== +iedriver@^3.14.2: + version "3.14.2" + resolved "https://registry.yarnpkg.com/iedriver/-/iedriver-3.14.2.tgz#a19391ff123e21823ce0afe300e38b58a7dc79c4" + integrity sha512-vvFwfpOOZXmpXT/3Oa9SOFrr4uZNNUtBKPLRz7z8oZigvvIOokDiBlbImrd80q+rgjkmqUGi6a2NnpyCOAXnOw== dependencies: - adm-zip "^0.4.13" - extract-zip "1.6.6" + extract-zip "1.7.0" kew "~0.1.7" - md5-file "^1.1.4" - mkdirp "0.3.5" + mkdirp "0.5.4" npmconf "^2.1.3" request "^2.88.0" rimraf "~2.0.2" @@ -20186,11 +20169,6 @@ material-colors@^1.2.1: resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.5.tgz#5292593e6754cb1bcc2b98030e4e0d6a3afc9ea1" integrity sha1-UpJZPmdUyxvMK5gDDk4Najr8nqE= -md5-file@^1.1.4: - version "1.1.10" - resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-1.1.10.tgz#d8f4fce76c92cb20b7d143a59f58ca49b4cf3174" - integrity sha1-2PT852ySyyC30UOln1jKSbTPMXQ= - md5.js@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" @@ -20775,18 +20753,6 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" -mkdirp@0.3.5, mkdirp@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" - integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= - -mkdirp@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" - integrity sha1-HXMHam35hs2TROFecfzAWkyavxI= - dependencies: - minimist "0.0.8" - mkdirp@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -20801,13 +20767,18 @@ mkdirp@0.5.3: dependencies: minimist "^1.2.5" -mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@~0.5.0, mkdirp@~0.5.1: +mkdirp@0.5.4, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.4, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== dependencies: minimist "^1.2.5" +mkdirp@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" + integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc= + mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" From 3c5eee7526c34e769824ce7309e647c7bb7c01fa Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Mon, 27 Apr 2020 08:41:17 +0200 Subject: [PATCH 15/26] Bump karma dev-dependency from 3.1.4 to 5.0.2 (#64403) --- package.json | 2 +- packages/kbn-pm/dist/index.js | 1955 ++++++++++++++++++++++++--------- yarn.lock | 167 +-- 3 files changed, 1471 insertions(+), 653 deletions(-) diff --git a/package.json b/package.json index e8633f5a138fb..fd6e10fb69424 100644 --- a/package.json +++ b/package.json @@ -450,7 +450,7 @@ "jest-raw-loader": "^1.0.1", "jimp": "^0.9.6", "json5": "^1.0.1", - "karma": "3.1.4", + "karma": "5.0.2", "karma-chrome-launcher": "2.2.0", "karma-coverage": "1.1.2", "karma-firefox-launcher": "1.1.0", diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index 6a2d02ee778dd..b921956642728 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -79178,7 +79178,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _build_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(704); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildProductionProjects", function() { return _build_production_projects__WEBPACK_IMPORTED_MODULE_0__["buildProductionProjects"]; }); -/* harmony import */ var _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(927); +/* harmony import */ var _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(939); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "prepareExternalProjectDependencies", function() { return _prepare_project_dependencies__WEBPACK_IMPORTED_MODULE_1__["prepareExternalProjectDependencies"]; }); /* @@ -79363,9 +79363,9 @@ const pAll = __webpack_require__(706); const arrify = __webpack_require__(708); const globby = __webpack_require__(709); const isGlob = __webpack_require__(603); -const cpFile = __webpack_require__(912); -const junk = __webpack_require__(924); -const CpyError = __webpack_require__(925); +const cpFile = __webpack_require__(924); +const junk = __webpack_require__(936); +const CpyError = __webpack_require__(937); const defaultOptions = { ignoreJunk: true @@ -79615,8 +79615,8 @@ const fs = __webpack_require__(23); const arrayUnion = __webpack_require__(710); const glob = __webpack_require__(712); const fastGlob = __webpack_require__(717); -const dirGlob = __webpack_require__(905); -const gitignore = __webpack_require__(908); +const dirGlob = __webpack_require__(917); +const gitignore = __webpack_require__(920); const DEFAULT_FILTER = () => false; @@ -81449,11 +81449,11 @@ module.exports.generateTasks = pkg.generateTasks; Object.defineProperty(exports, "__esModule", { value: true }); var optionsManager = __webpack_require__(719); var taskManager = __webpack_require__(720); -var reader_async_1 = __webpack_require__(876); -var reader_stream_1 = __webpack_require__(900); -var reader_sync_1 = __webpack_require__(901); -var arrayUtils = __webpack_require__(903); -var streamUtils = __webpack_require__(904); +var reader_async_1 = __webpack_require__(888); +var reader_stream_1 = __webpack_require__(912); +var reader_sync_1 = __webpack_require__(913); +var arrayUtils = __webpack_require__(915); +var streamUtils = __webpack_require__(916); /** * Synchronous API. */ @@ -82085,17 +82085,17 @@ module.exports = function isGlob(str, options) { var util = __webpack_require__(29); var braces = __webpack_require__(727); -var toRegex = __webpack_require__(829); -var extend = __webpack_require__(837); +var toRegex = __webpack_require__(840); +var extend = __webpack_require__(848); /** * Local dependencies */ -var compilers = __webpack_require__(840); -var parsers = __webpack_require__(872); -var cache = __webpack_require__(873); -var utils = __webpack_require__(874); +var compilers = __webpack_require__(851); +var parsers = __webpack_require__(884); +var cache = __webpack_require__(885); +var utils = __webpack_require__(886); var MAX_LENGTH = 1024 * 64; /** @@ -82968,17 +82968,17 @@ module.exports = micromatch; */ var toRegex = __webpack_require__(728); -var unique = __webpack_require__(740); +var unique = __webpack_require__(742); var extend = __webpack_require__(737); /** * Local dependencies */ -var compilers = __webpack_require__(741); -var parsers = __webpack_require__(756); -var Braces = __webpack_require__(766); -var utils = __webpack_require__(742); +var compilers = __webpack_require__(743); +var parsers = __webpack_require__(760); +var Braces = __webpack_require__(770); +var utils = __webpack_require__(744); var MAX_LENGTH = 1024 * 64; var cache = {}; @@ -84132,7 +84132,7 @@ module.exports = function isExtendable(val) { "use strict"; -var extend = __webpack_require__(737); +var extend = __webpack_require__(740); /** * The main export is a function that takes a `pattern` string and an `options` object. @@ -84202,6 +84202,66 @@ module.exports = toRegex; /* 740 */ /***/ (function(module, exports, __webpack_require__) { +"use strict"; + + +var isObject = __webpack_require__(741); + +module.exports = function extend(o/*, objects*/) { + if (!isObject(o)) { o = {}; } + + var len = arguments.length; + for (var i = 1; i < len; i++) { + var obj = arguments[i]; + + if (isObject(obj)) { + assign(o, obj); + } + } + return o; +}; + +function assign(a, b) { + for (var key in b) { + if (hasOwn(b, key)) { + a[key] = b[key]; + } + } +} + +/** + * Returns true if the given `key` is an own property of `obj`. + */ + +function hasOwn(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} + + +/***/ }), +/* 741 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/*! + * is-extendable + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +module.exports = function isExtendable(val) { + return typeof val !== 'undefined' && val !== null + && (typeof val === 'object' || typeof val === 'function'); +}; + + +/***/ }), +/* 742 */ +/***/ (function(module, exports, __webpack_require__) { + "use strict"; /*! * array-unique @@ -84249,13 +84309,13 @@ module.exports.immutable = function uniqueImmutable(arr) { /***/ }), -/* 741 */ +/* 743 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(742); +var utils = __webpack_require__(744); module.exports = function(braces, options) { braces.compiler @@ -84538,13 +84598,13 @@ function hasQueue(node) { /***/ }), -/* 742 */ +/* 744 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var splitString = __webpack_require__(743); +var splitString = __webpack_require__(745); var utils = module.exports; /** @@ -84552,11 +84612,11 @@ var utils = module.exports; */ utils.extend = __webpack_require__(737); -utils.flatten = __webpack_require__(749); -utils.isObject = __webpack_require__(747); -utils.fillRange = __webpack_require__(750); -utils.repeat = __webpack_require__(755); -utils.unique = __webpack_require__(740); +utils.flatten = __webpack_require__(751); +utils.isObject = __webpack_require__(749); +utils.fillRange = __webpack_require__(752); +utils.repeat = __webpack_require__(759); +utils.unique = __webpack_require__(742); utils.define = function(obj, key, val) { Object.defineProperty(obj, key, { @@ -84888,7 +84948,7 @@ utils.escapeRegex = function(str) { /***/ }), -/* 743 */ +/* 745 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84901,7 +84961,7 @@ utils.escapeRegex = function(str) { -var extend = __webpack_require__(744); +var extend = __webpack_require__(746); module.exports = function(str, options, fn) { if (typeof str !== 'string') { @@ -85066,14 +85126,14 @@ function keepEscaping(opts, str, idx) { /***/ }), -/* 744 */ +/* 746 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(745); -var assignSymbols = __webpack_require__(748); +var isExtendable = __webpack_require__(747); +var assignSymbols = __webpack_require__(750); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -85133,7 +85193,7 @@ function isEnum(obj, key) { /***/ }), -/* 745 */ +/* 747 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85146,7 +85206,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(746); +var isPlainObject = __webpack_require__(748); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -85154,7 +85214,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 746 */ +/* 748 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85167,7 +85227,7 @@ module.exports = function isExtendable(val) { -var isObject = __webpack_require__(747); +var isObject = __webpack_require__(749); function isObjectObject(o) { return isObject(o) === true @@ -85198,7 +85258,7 @@ module.exports = function isPlainObject(o) { /***/ }), -/* 747 */ +/* 749 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85217,7 +85277,7 @@ module.exports = function isObject(val) { /***/ }), -/* 748 */ +/* 750 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85264,7 +85324,7 @@ module.exports = function(receiver, objects) { /***/ }), -/* 749 */ +/* 751 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85293,7 +85353,7 @@ function flat(arr, res) { /***/ }), -/* 750 */ +/* 752 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85307,10 +85367,10 @@ function flat(arr, res) { var util = __webpack_require__(29); -var isNumber = __webpack_require__(751); -var extend = __webpack_require__(737); -var repeat = __webpack_require__(753); -var toRegex = __webpack_require__(754); +var isNumber = __webpack_require__(753); +var extend = __webpack_require__(755); +var repeat = __webpack_require__(757); +var toRegex = __webpack_require__(758); /** * Return a range of numbers or letters. @@ -85508,7 +85568,7 @@ module.exports = fillRange; /***/ }), -/* 751 */ +/* 753 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85521,7 +85581,7 @@ module.exports = fillRange; -var typeOf = __webpack_require__(752); +var typeOf = __webpack_require__(754); module.exports = function isNumber(num) { var type = typeOf(num); @@ -85537,7 +85597,7 @@ module.exports = function isNumber(num) { /***/ }), -/* 752 */ +/* 754 */ /***/ (function(module, exports, __webpack_require__) { var isBuffer = __webpack_require__(734); @@ -85659,7 +85719,67 @@ module.exports = function kindOf(val) { /***/ }), -/* 753 */ +/* 755 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var isObject = __webpack_require__(756); + +module.exports = function extend(o/*, objects*/) { + if (!isObject(o)) { o = {}; } + + var len = arguments.length; + for (var i = 1; i < len; i++) { + var obj = arguments[i]; + + if (isObject(obj)) { + assign(o, obj); + } + } + return o; +}; + +function assign(a, b) { + for (var key in b) { + if (hasOwn(b, key)) { + a[key] = b[key]; + } + } +} + +/** + * Returns true if the given `key` is an own property of `obj`. + */ + +function hasOwn(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} + + +/***/ }), +/* 756 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/*! + * is-extendable + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +module.exports = function isExtendable(val) { + return typeof val !== 'undefined' && val !== null + && (typeof val === 'object' || typeof val === 'function'); +}; + + +/***/ }), +/* 757 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85736,7 +85856,7 @@ function repeat(str, num) { /***/ }), -/* 754 */ +/* 758 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85749,8 +85869,8 @@ function repeat(str, num) { -var repeat = __webpack_require__(753); -var isNumber = __webpack_require__(751); +var repeat = __webpack_require__(757); +var isNumber = __webpack_require__(753); var cache = {}; function toRegexRange(min, max, options) { @@ -86037,7 +86157,7 @@ module.exports = toRegexRange; /***/ }), -/* 755 */ +/* 759 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86062,14 +86182,14 @@ module.exports = function repeat(ele, num) { /***/ }), -/* 756 */ +/* 760 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Node = __webpack_require__(757); -var utils = __webpack_require__(742); +var Node = __webpack_require__(761); +var utils = __webpack_require__(744); /** * Braces parsers @@ -86429,15 +86549,15 @@ function concatNodes(pos, node, parent, options) { /***/ }), -/* 757 */ +/* 761 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(747); -var define = __webpack_require__(758); -var utils = __webpack_require__(765); +var isObject = __webpack_require__(749); +var define = __webpack_require__(762); +var utils = __webpack_require__(769); var ownNames; /** @@ -86928,7 +87048,7 @@ exports = module.exports = Node; /***/ }), -/* 758 */ +/* 762 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86941,7 +87061,7 @@ exports = module.exports = Node; -var isDescriptor = __webpack_require__(759); +var isDescriptor = __webpack_require__(763); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -86966,7 +87086,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 759 */ +/* 763 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86979,9 +87099,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(760); -var isAccessor = __webpack_require__(761); -var isData = __webpack_require__(763); +var typeOf = __webpack_require__(764); +var isAccessor = __webpack_require__(765); +var isData = __webpack_require__(767); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -86995,7 +87115,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 760 */ +/* 764 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -87130,7 +87250,7 @@ function isBuffer(val) { /***/ }), -/* 761 */ +/* 765 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87143,7 +87263,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(762); +var typeOf = __webpack_require__(766); // accessor descriptor properties var accessor = { @@ -87206,7 +87326,7 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 762 */ +/* 766 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -87341,7 +87461,7 @@ function isBuffer(val) { /***/ }), -/* 763 */ +/* 767 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87354,7 +87474,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(764); +var typeOf = __webpack_require__(768); module.exports = function isDataDescriptor(obj, prop) { // data descriptor properties @@ -87397,7 +87517,7 @@ module.exports = function isDataDescriptor(obj, prop) { /***/ }), -/* 764 */ +/* 768 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -87532,13 +87652,13 @@ function isBuffer(val) { /***/ }), -/* 765 */ +/* 769 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(752); +var typeOf = __webpack_require__(754); var utils = module.exports; /** @@ -88558,17 +88678,17 @@ function assert(val, message) { /***/ }), -/* 766 */ +/* 770 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var extend = __webpack_require__(737); -var Snapdragon = __webpack_require__(767); -var compilers = __webpack_require__(741); -var parsers = __webpack_require__(756); -var utils = __webpack_require__(742); +var Snapdragon = __webpack_require__(771); +var compilers = __webpack_require__(743); +var parsers = __webpack_require__(760); +var utils = __webpack_require__(744); /** * Customize Snapdragon parser and renderer @@ -88669,17 +88789,17 @@ module.exports = Braces; /***/ }), -/* 767 */ +/* 771 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Base = __webpack_require__(768); -var define = __webpack_require__(729); -var Compiler = __webpack_require__(797); -var Parser = __webpack_require__(826); -var utils = __webpack_require__(806); +var Base = __webpack_require__(772); +var define = __webpack_require__(798); +var Compiler = __webpack_require__(808); +var Parser = __webpack_require__(837); +var utils = __webpack_require__(817); var regexCache = {}; var cache = {}; @@ -88850,20 +88970,20 @@ module.exports.Parser = Parser; /***/ }), -/* 768 */ +/* 772 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(29); -var define = __webpack_require__(769); -var CacheBase = __webpack_require__(770); -var Emitter = __webpack_require__(771); -var isObject = __webpack_require__(747); -var merge = __webpack_require__(788); -var pascal = __webpack_require__(791); -var cu = __webpack_require__(792); +var define = __webpack_require__(773); +var CacheBase = __webpack_require__(774); +var Emitter = __webpack_require__(775); +var isObject = __webpack_require__(749); +var merge = __webpack_require__(792); +var pascal = __webpack_require__(795); +var cu = __webpack_require__(796); /** * Optionally define a custom `cache` namespace to use. @@ -89292,7 +89412,7 @@ module.exports.namespace = namespace; /***/ }), -/* 769 */ +/* 773 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89305,7 +89425,7 @@ module.exports.namespace = namespace; -var isDescriptor = __webpack_require__(759); +var isDescriptor = __webpack_require__(763); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -89330,21 +89450,21 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 770 */ +/* 774 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(747); -var Emitter = __webpack_require__(771); -var visit = __webpack_require__(772); -var toPath = __webpack_require__(775); -var union = __webpack_require__(776); -var del = __webpack_require__(780); -var get = __webpack_require__(778); -var has = __webpack_require__(785); -var set = __webpack_require__(779); +var isObject = __webpack_require__(749); +var Emitter = __webpack_require__(775); +var visit = __webpack_require__(776); +var toPath = __webpack_require__(779); +var union = __webpack_require__(780); +var del = __webpack_require__(784); +var get = __webpack_require__(782); +var has = __webpack_require__(789); +var set = __webpack_require__(783); /** * Create a `Cache` constructor that when instantiated will @@ -89598,7 +89718,7 @@ module.exports.namespace = namespace; /***/ }), -/* 771 */ +/* 775 */ /***/ (function(module, exports, __webpack_require__) { @@ -89767,7 +89887,7 @@ Emitter.prototype.hasListeners = function(event){ /***/ }), -/* 772 */ +/* 776 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89780,8 +89900,8 @@ Emitter.prototype.hasListeners = function(event){ -var visit = __webpack_require__(773); -var mapVisit = __webpack_require__(774); +var visit = __webpack_require__(777); +var mapVisit = __webpack_require__(778); module.exports = function(collection, method, val) { var result; @@ -89804,7 +89924,7 @@ module.exports = function(collection, method, val) { /***/ }), -/* 773 */ +/* 777 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89817,7 +89937,7 @@ module.exports = function(collection, method, val) { -var isObject = __webpack_require__(747); +var isObject = __webpack_require__(749); module.exports = function visit(thisArg, method, target, val) { if (!isObject(thisArg) && typeof thisArg !== 'function') { @@ -89844,14 +89964,14 @@ module.exports = function visit(thisArg, method, target, val) { /***/ }), -/* 774 */ +/* 778 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(29); -var visit = __webpack_require__(773); +var visit = __webpack_require__(777); /** * Map `visit` over an array of objects. @@ -89888,7 +90008,7 @@ function isObject(val) { /***/ }), -/* 775 */ +/* 779 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -89901,7 +90021,7 @@ function isObject(val) { -var typeOf = __webpack_require__(752); +var typeOf = __webpack_require__(754); module.exports = function toPath(args) { if (typeOf(args) !== 'arguments') { @@ -89928,16 +90048,16 @@ function filter(arr) { /***/ }), -/* 776 */ +/* 780 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(738); -var union = __webpack_require__(777); -var get = __webpack_require__(778); -var set = __webpack_require__(779); +var isObject = __webpack_require__(741); +var union = __webpack_require__(781); +var get = __webpack_require__(782); +var set = __webpack_require__(783); module.exports = function unionValue(obj, prop, value) { if (!isObject(obj)) { @@ -89965,7 +90085,7 @@ function arrayify(val) { /***/ }), -/* 777 */ +/* 781 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90001,7 +90121,7 @@ module.exports = function union(init) { /***/ }), -/* 778 */ +/* 782 */ /***/ (function(module, exports) { /*! @@ -90057,7 +90177,7 @@ function toString(val) { /***/ }), -/* 779 */ +/* 783 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90070,10 +90190,10 @@ function toString(val) { -var split = __webpack_require__(743); -var extend = __webpack_require__(737); -var isPlainObject = __webpack_require__(746); -var isObject = __webpack_require__(738); +var split = __webpack_require__(745); +var extend = __webpack_require__(740); +var isPlainObject = __webpack_require__(748); +var isObject = __webpack_require__(741); module.exports = function(obj, prop, val) { if (!isObject(obj)) { @@ -90119,7 +90239,7 @@ function isValidKey(key) { /***/ }), -/* 780 */ +/* 784 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90132,8 +90252,8 @@ function isValidKey(key) { -var isObject = __webpack_require__(747); -var has = __webpack_require__(781); +var isObject = __webpack_require__(749); +var has = __webpack_require__(785); module.exports = function unset(obj, prop) { if (!isObject(obj)) { @@ -90158,7 +90278,7 @@ module.exports = function unset(obj, prop) { /***/ }), -/* 781 */ +/* 785 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90171,9 +90291,9 @@ module.exports = function unset(obj, prop) { -var isObject = __webpack_require__(782); -var hasValues = __webpack_require__(784); -var get = __webpack_require__(778); +var isObject = __webpack_require__(786); +var hasValues = __webpack_require__(788); +var get = __webpack_require__(782); module.exports = function(obj, prop, noZero) { if (isObject(obj)) { @@ -90184,7 +90304,7 @@ module.exports = function(obj, prop, noZero) { /***/ }), -/* 782 */ +/* 786 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90197,7 +90317,7 @@ module.exports = function(obj, prop, noZero) { -var isArray = __webpack_require__(783); +var isArray = __webpack_require__(787); module.exports = function isObject(val) { return val != null && typeof val === 'object' && isArray(val) === false; @@ -90205,7 +90325,7 @@ module.exports = function isObject(val) { /***/ }), -/* 783 */ +/* 787 */ /***/ (function(module, exports) { var toString = {}.toString; @@ -90216,7 +90336,7 @@ module.exports = Array.isArray || function (arr) { /***/ }), -/* 784 */ +/* 788 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90259,7 +90379,7 @@ module.exports = function hasValue(o, noZero) { /***/ }), -/* 785 */ +/* 789 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90272,9 +90392,9 @@ module.exports = function hasValue(o, noZero) { -var isObject = __webpack_require__(747); -var hasValues = __webpack_require__(786); -var get = __webpack_require__(778); +var isObject = __webpack_require__(749); +var hasValues = __webpack_require__(790); +var get = __webpack_require__(782); module.exports = function(val, prop) { return hasValues(isObject(val) && prop ? get(val, prop) : val); @@ -90282,7 +90402,7 @@ module.exports = function(val, prop) { /***/ }), -/* 786 */ +/* 790 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90295,8 +90415,8 @@ module.exports = function(val, prop) { -var typeOf = __webpack_require__(787); -var isNumber = __webpack_require__(751); +var typeOf = __webpack_require__(791); +var isNumber = __webpack_require__(753); module.exports = function hasValue(val) { // is-number checks for NaN and other edge cases @@ -90349,7 +90469,7 @@ module.exports = function hasValue(val) { /***/ }), -/* 787 */ +/* 791 */ /***/ (function(module, exports, __webpack_require__) { var isBuffer = __webpack_require__(734); @@ -90474,14 +90594,14 @@ module.exports = function kindOf(val) { /***/ }), -/* 788 */ +/* 792 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(789); -var forIn = __webpack_require__(790); +var isExtendable = __webpack_require__(793); +var forIn = __webpack_require__(794); function mixinDeep(target, objects) { var len = arguments.length, i = 0; @@ -90545,7 +90665,7 @@ module.exports = mixinDeep; /***/ }), -/* 789 */ +/* 793 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90558,7 +90678,7 @@ module.exports = mixinDeep; -var isPlainObject = __webpack_require__(746); +var isPlainObject = __webpack_require__(748); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -90566,7 +90686,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 790 */ +/* 794 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90589,7 +90709,7 @@ module.exports = function forIn(obj, fn, thisArg) { /***/ }), -/* 791 */ +/* 795 */ /***/ (function(module, exports) { /*! @@ -90616,14 +90736,14 @@ module.exports = pascalcase; /***/ }), -/* 792 */ +/* 796 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(29); -var utils = __webpack_require__(793); +var utils = __webpack_require__(797); /** * Expose class utils @@ -90988,7 +91108,7 @@ cu.bubble = function(Parent, events) { /***/ }), -/* 793 */ +/* 797 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91002,10 +91122,10 @@ var utils = {}; * Lazily required module dependencies */ -utils.union = __webpack_require__(777); -utils.define = __webpack_require__(729); -utils.isObj = __webpack_require__(747); -utils.staticExtend = __webpack_require__(794); +utils.union = __webpack_require__(781); +utils.define = __webpack_require__(798); +utils.isObj = __webpack_require__(749); +utils.staticExtend = __webpack_require__(805); /** @@ -91016,36 +91136,638 @@ module.exports = utils; /***/ }), -/* 794 */ +/* 798 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /*! - * static-extend + * define-property * - * Copyright (c) 2016, Jon Schlinkert. + * Copyright (c) 2015, Jon Schlinkert. * Licensed under the MIT License. */ -var copy = __webpack_require__(795); -var define = __webpack_require__(729); -var util = __webpack_require__(29); +var isDescriptor = __webpack_require__(799); -/** - * Returns a function for extending the static properties, - * prototype properties, and descriptors from the `Parent` - * constructor onto `Child` constructors. - * - * ```js - * var extend = require('static-extend'); - * Parent.extend = extend(Parent); - * - * // optionally pass a custom merge function as the second arg - * Parent.extend = extend(Parent, function(Child) { - * Child.prototype.mixin = function(key, val) { - * Child.prototype[key] = val; +module.exports = function defineProperty(obj, prop, val) { + if (typeof obj !== 'object' && typeof obj !== 'function') { + throw new TypeError('expected an object or function.'); + } + + if (typeof prop !== 'string') { + throw new TypeError('expected `prop` to be a string.'); + } + + if (isDescriptor(val) && ('set' in val || 'get' in val)) { + return Object.defineProperty(obj, prop, val); + } + + return Object.defineProperty(obj, prop, { + configurable: true, + enumerable: false, + writable: true, + value: val + }); +}; + + +/***/ }), +/* 799 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/*! + * is-descriptor + * + * Copyright (c) 2015-2017, Jon Schlinkert. + * Released under the MIT License. + */ + + + +var typeOf = __webpack_require__(800); +var isAccessor = __webpack_require__(801); +var isData = __webpack_require__(803); + +module.exports = function isDescriptor(obj, key) { + if (typeOf(obj) !== 'object') { + return false; + } + if ('get' in obj) { + return isAccessor(obj, key); + } + return isData(obj, key); +}; + + +/***/ }), +/* 800 */ +/***/ (function(module, exports) { + +var toString = Object.prototype.toString; + +/** + * Get the native `typeof` a value. + * + * @param {*} `val` + * @return {*} Native javascript type + */ + +module.exports = function kindOf(val) { + var type = typeof val; + + // primitivies + if (type === 'undefined') { + return 'undefined'; + } + if (val === null) { + return 'null'; + } + if (val === true || val === false || val instanceof Boolean) { + return 'boolean'; + } + if (type === 'string' || val instanceof String) { + return 'string'; + } + if (type === 'number' || val instanceof Number) { + return 'number'; + } + + // functions + if (type === 'function' || val instanceof Function) { + if (typeof val.constructor.name !== 'undefined' && val.constructor.name.slice(0, 9) === 'Generator') { + return 'generatorfunction'; + } + return 'function'; + } + + // array + if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { + return 'array'; + } + + // check for instances of RegExp and Date before calling `toString` + if (val instanceof RegExp) { + return 'regexp'; + } + if (val instanceof Date) { + return 'date'; + } + + // other objects + type = toString.call(val); + + if (type === '[object RegExp]') { + return 'regexp'; + } + if (type === '[object Date]') { + return 'date'; + } + if (type === '[object Arguments]') { + return 'arguments'; + } + if (type === '[object Error]') { + return 'error'; + } + if (type === '[object Promise]') { + return 'promise'; + } + + // buffer + if (isBuffer(val)) { + return 'buffer'; + } + + // es6: Map, WeakMap, Set, WeakSet + if (type === '[object Set]') { + return 'set'; + } + if (type === '[object WeakSet]') { + return 'weakset'; + } + if (type === '[object Map]') { + return 'map'; + } + if (type === '[object WeakMap]') { + return 'weakmap'; + } + if (type === '[object Symbol]') { + return 'symbol'; + } + + if (type === '[object Map Iterator]') { + return 'mapiterator'; + } + if (type === '[object Set Iterator]') { + return 'setiterator'; + } + if (type === '[object String Iterator]') { + return 'stringiterator'; + } + if (type === '[object Array Iterator]') { + return 'arrayiterator'; + } + + // typed arrays + if (type === '[object Int8Array]') { + return 'int8array'; + } + if (type === '[object Uint8Array]') { + return 'uint8array'; + } + if (type === '[object Uint8ClampedArray]') { + return 'uint8clampedarray'; + } + if (type === '[object Int16Array]') { + return 'int16array'; + } + if (type === '[object Uint16Array]') { + return 'uint16array'; + } + if (type === '[object Int32Array]') { + return 'int32array'; + } + if (type === '[object Uint32Array]') { + return 'uint32array'; + } + if (type === '[object Float32Array]') { + return 'float32array'; + } + if (type === '[object Float64Array]') { + return 'float64array'; + } + + // must be a plain object + return 'object'; +}; + +/** + * If you need to support Safari 5-7 (8-10 yr-old browser), + * take a look at https://github.com/feross/is-buffer + */ + +function isBuffer(val) { + return val.constructor + && typeof val.constructor.isBuffer === 'function' + && val.constructor.isBuffer(val); +} + + +/***/ }), +/* 801 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/*! + * is-accessor-descriptor + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +var typeOf = __webpack_require__(802); + +// accessor descriptor properties +var accessor = { + get: 'function', + set: 'function', + configurable: 'boolean', + enumerable: 'boolean' +}; + +function isAccessorDescriptor(obj, prop) { + if (typeof prop === 'string') { + var val = Object.getOwnPropertyDescriptor(obj, prop); + return typeof val !== 'undefined'; + } + + if (typeOf(obj) !== 'object') { + return false; + } + + if (has(obj, 'value') || has(obj, 'writable')) { + return false; + } + + if (!has(obj, 'get') || typeof obj.get !== 'function') { + return false; + } + + // tldr: it's valid to have "set" be undefined + // "set" might be undefined if `Object.getOwnPropertyDescriptor` + // was used to get the value, and only `get` was defined by the user + if (has(obj, 'set') && typeof obj[key] !== 'function' && typeof obj[key] !== 'undefined') { + return false; + } + + for (var key in obj) { + if (!accessor.hasOwnProperty(key)) { + continue; + } + + if (typeOf(obj[key]) === accessor[key]) { + continue; + } + + if (typeof obj[key] !== 'undefined') { + return false; + } + } + return true; +} + +function has(obj, key) { + return {}.hasOwnProperty.call(obj, key); +} + +/** + * Expose `isAccessorDescriptor` + */ + +module.exports = isAccessorDescriptor; + + +/***/ }), +/* 802 */ +/***/ (function(module, exports, __webpack_require__) { + +var isBuffer = __webpack_require__(734); +var toString = Object.prototype.toString; + +/** + * Get the native `typeof` a value. + * + * @param {*} `val` + * @return {*} Native javascript type + */ + +module.exports = function kindOf(val) { + // primitivies + if (typeof val === 'undefined') { + return 'undefined'; + } + if (val === null) { + return 'null'; + } + if (val === true || val === false || val instanceof Boolean) { + return 'boolean'; + } + if (typeof val === 'string' || val instanceof String) { + return 'string'; + } + if (typeof val === 'number' || val instanceof Number) { + return 'number'; + } + + // functions + if (typeof val === 'function' || val instanceof Function) { + return 'function'; + } + + // array + if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { + return 'array'; + } + + // check for instances of RegExp and Date before calling `toString` + if (val instanceof RegExp) { + return 'regexp'; + } + if (val instanceof Date) { + return 'date'; + } + + // other objects + var type = toString.call(val); + + if (type === '[object RegExp]') { + return 'regexp'; + } + if (type === '[object Date]') { + return 'date'; + } + if (type === '[object Arguments]') { + return 'arguments'; + } + if (type === '[object Error]') { + return 'error'; + } + + // buffer + if (isBuffer(val)) { + return 'buffer'; + } + + // es6: Map, WeakMap, Set, WeakSet + if (type === '[object Set]') { + return 'set'; + } + if (type === '[object WeakSet]') { + return 'weakset'; + } + if (type === '[object Map]') { + return 'map'; + } + if (type === '[object WeakMap]') { + return 'weakmap'; + } + if (type === '[object Symbol]') { + return 'symbol'; + } + + // typed arrays + if (type === '[object Int8Array]') { + return 'int8array'; + } + if (type === '[object Uint8Array]') { + return 'uint8array'; + } + if (type === '[object Uint8ClampedArray]') { + return 'uint8clampedarray'; + } + if (type === '[object Int16Array]') { + return 'int16array'; + } + if (type === '[object Uint16Array]') { + return 'uint16array'; + } + if (type === '[object Int32Array]') { + return 'int32array'; + } + if (type === '[object Uint32Array]') { + return 'uint32array'; + } + if (type === '[object Float32Array]') { + return 'float32array'; + } + if (type === '[object Float64Array]') { + return 'float64array'; + } + + // must be a plain object + return 'object'; +}; + + +/***/ }), +/* 803 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/*! + * is-data-descriptor + * + * Copyright (c) 2015, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +var typeOf = __webpack_require__(804); + +// data descriptor properties +var data = { + configurable: 'boolean', + enumerable: 'boolean', + writable: 'boolean' +}; + +function isDataDescriptor(obj, prop) { + if (typeOf(obj) !== 'object') { + return false; + } + + if (typeof prop === 'string') { + var val = Object.getOwnPropertyDescriptor(obj, prop); + return typeof val !== 'undefined'; + } + + if (!('value' in obj) && !('writable' in obj)) { + return false; + } + + for (var key in obj) { + if (key === 'value') continue; + + if (!data.hasOwnProperty(key)) { + continue; + } + + if (typeOf(obj[key]) === data[key]) { + continue; + } + + if (typeof obj[key] !== 'undefined') { + return false; + } + } + return true; +} + +/** + * Expose `isDataDescriptor` + */ + +module.exports = isDataDescriptor; + + +/***/ }), +/* 804 */ +/***/ (function(module, exports, __webpack_require__) { + +var isBuffer = __webpack_require__(734); +var toString = Object.prototype.toString; + +/** + * Get the native `typeof` a value. + * + * @param {*} `val` + * @return {*} Native javascript type + */ + +module.exports = function kindOf(val) { + // primitivies + if (typeof val === 'undefined') { + return 'undefined'; + } + if (val === null) { + return 'null'; + } + if (val === true || val === false || val instanceof Boolean) { + return 'boolean'; + } + if (typeof val === 'string' || val instanceof String) { + return 'string'; + } + if (typeof val === 'number' || val instanceof Number) { + return 'number'; + } + + // functions + if (typeof val === 'function' || val instanceof Function) { + return 'function'; + } + + // array + if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) { + return 'array'; + } + + // check for instances of RegExp and Date before calling `toString` + if (val instanceof RegExp) { + return 'regexp'; + } + if (val instanceof Date) { + return 'date'; + } + + // other objects + var type = toString.call(val); + + if (type === '[object RegExp]') { + return 'regexp'; + } + if (type === '[object Date]') { + return 'date'; + } + if (type === '[object Arguments]') { + return 'arguments'; + } + if (type === '[object Error]') { + return 'error'; + } + + // buffer + if (isBuffer(val)) { + return 'buffer'; + } + + // es6: Map, WeakMap, Set, WeakSet + if (type === '[object Set]') { + return 'set'; + } + if (type === '[object WeakSet]') { + return 'weakset'; + } + if (type === '[object Map]') { + return 'map'; + } + if (type === '[object WeakMap]') { + return 'weakmap'; + } + if (type === '[object Symbol]') { + return 'symbol'; + } + + // typed arrays + if (type === '[object Int8Array]') { + return 'int8array'; + } + if (type === '[object Uint8Array]') { + return 'uint8array'; + } + if (type === '[object Uint8ClampedArray]') { + return 'uint8clampedarray'; + } + if (type === '[object Int16Array]') { + return 'int16array'; + } + if (type === '[object Uint16Array]') { + return 'uint16array'; + } + if (type === '[object Int32Array]') { + return 'int32array'; + } + if (type === '[object Uint32Array]') { + return 'uint32array'; + } + if (type === '[object Float32Array]') { + return 'float32array'; + } + if (type === '[object Float64Array]') { + return 'float64array'; + } + + // must be a plain object + return 'object'; +}; + + +/***/ }), +/* 805 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/*! + * static-extend + * + * Copyright (c) 2016, Jon Schlinkert. + * Licensed under the MIT License. + */ + + + +var copy = __webpack_require__(806); +var define = __webpack_require__(798); +var util = __webpack_require__(29); + +/** + * Returns a function for extending the static properties, + * prototype properties, and descriptors from the `Parent` + * constructor onto `Child` constructors. + * + * ```js + * var extend = require('static-extend'); + * Parent.extend = extend(Parent); + * + * // optionally pass a custom merge function as the second arg + * Parent.extend = extend(Parent, function(Child) { + * Child.prototype.mixin = function(key, val) { + * Child.prototype[key] = val; * }; * }); * @@ -91113,15 +91835,15 @@ module.exports = extend; /***/ }), -/* 795 */ +/* 806 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(752); -var copyDescriptor = __webpack_require__(796); -var define = __webpack_require__(729); +var typeOf = __webpack_require__(754); +var copyDescriptor = __webpack_require__(807); +var define = __webpack_require__(798); /** * Copy static properties, prototype properties, and descriptors from one object to another. @@ -91294,7 +92016,7 @@ module.exports.has = has; /***/ }), -/* 796 */ +/* 807 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91382,16 +92104,16 @@ function isObject(val) { /***/ }), -/* 797 */ +/* 808 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(798); -var define = __webpack_require__(729); -var debug = __webpack_require__(800)('snapdragon:compiler'); -var utils = __webpack_require__(806); +var use = __webpack_require__(809); +var define = __webpack_require__(798); +var debug = __webpack_require__(811)('snapdragon:compiler'); +var utils = __webpack_require__(817); /** * Create a new `Compiler` with the given `options`. @@ -91545,7 +92267,7 @@ Compiler.prototype = { // source map support if (opts.sourcemap) { - var sourcemaps = __webpack_require__(825); + var sourcemaps = __webpack_require__(836); sourcemaps(this); this.mapVisit(this.ast.nodes); this.applySourceMaps(); @@ -91566,7 +92288,7 @@ module.exports = Compiler; /***/ }), -/* 798 */ +/* 809 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91579,7 +92301,7 @@ module.exports = Compiler; -var utils = __webpack_require__(799); +var utils = __webpack_require__(810); module.exports = function base(app, opts) { if (!utils.isObject(app) && typeof app !== 'function') { @@ -91694,7 +92416,7 @@ module.exports = function base(app, opts) { /***/ }), -/* 799 */ +/* 810 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91708,8 +92430,8 @@ var utils = {}; * Lazily required module dependencies */ -utils.define = __webpack_require__(729); -utils.isObject = __webpack_require__(747); +utils.define = __webpack_require__(798); +utils.isObject = __webpack_require__(749); utils.isString = function(val) { @@ -91724,7 +92446,7 @@ module.exports = utils; /***/ }), -/* 800 */ +/* 811 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -91733,14 +92455,14 @@ module.exports = utils; */ if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(801); + module.exports = __webpack_require__(812); } else { - module.exports = __webpack_require__(804); + module.exports = __webpack_require__(815); } /***/ }), -/* 801 */ +/* 812 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -91749,7 +92471,7 @@ if (typeof process !== 'undefined' && process.type === 'renderer') { * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(802); +exports = module.exports = __webpack_require__(813); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; @@ -91931,7 +92653,7 @@ function localstorage() { /***/ }), -/* 802 */ +/* 813 */ /***/ (function(module, exports, __webpack_require__) { @@ -91947,7 +92669,7 @@ exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; -exports.humanize = __webpack_require__(803); +exports.humanize = __webpack_require__(814); /** * The currently active debug mode names, and names to skip. @@ -92139,7 +92861,7 @@ function coerce(val) { /***/ }), -/* 803 */ +/* 814 */ /***/ (function(module, exports) { /** @@ -92297,7 +93019,7 @@ function plural(ms, n, name) { /***/ }), -/* 804 */ +/* 815 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -92313,7 +93035,7 @@ var util = __webpack_require__(29); * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(802); +exports = module.exports = __webpack_require__(813); exports.init = init; exports.log = log; exports.formatArgs = formatArgs; @@ -92492,7 +93214,7 @@ function createWritableStdioStream (fd) { case 'PIPE': case 'TCP': - var net = __webpack_require__(805); + var net = __webpack_require__(816); stream = new net.Socket({ fd: fd, readable: false, @@ -92551,13 +93273,13 @@ exports.enable(load()); /***/ }), -/* 805 */ +/* 816 */ /***/ (function(module, exports) { module.exports = require("net"); /***/ }), -/* 806 */ +/* 817 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -92567,9 +93289,9 @@ module.exports = require("net"); * Module dependencies */ -exports.extend = __webpack_require__(737); -exports.SourceMap = __webpack_require__(807); -exports.sourceMapResolve = __webpack_require__(818); +exports.extend = __webpack_require__(740); +exports.SourceMap = __webpack_require__(818); +exports.sourceMapResolve = __webpack_require__(829); /** * Convert backslash in the given string to forward slashes @@ -92612,7 +93334,7 @@ exports.last = function(arr, n) { /***/ }), -/* 807 */ +/* 818 */ /***/ (function(module, exports, __webpack_require__) { /* @@ -92620,13 +93342,13 @@ exports.last = function(arr, n) { * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ -exports.SourceMapGenerator = __webpack_require__(808).SourceMapGenerator; -exports.SourceMapConsumer = __webpack_require__(814).SourceMapConsumer; -exports.SourceNode = __webpack_require__(817).SourceNode; +exports.SourceMapGenerator = __webpack_require__(819).SourceMapGenerator; +exports.SourceMapConsumer = __webpack_require__(825).SourceMapConsumer; +exports.SourceNode = __webpack_require__(828).SourceNode; /***/ }), -/* 808 */ +/* 819 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -92636,10 +93358,10 @@ exports.SourceNode = __webpack_require__(817).SourceNode; * http://opensource.org/licenses/BSD-3-Clause */ -var base64VLQ = __webpack_require__(809); -var util = __webpack_require__(811); -var ArraySet = __webpack_require__(812).ArraySet; -var MappingList = __webpack_require__(813).MappingList; +var base64VLQ = __webpack_require__(820); +var util = __webpack_require__(822); +var ArraySet = __webpack_require__(823).ArraySet; +var MappingList = __webpack_require__(824).MappingList; /** * An instance of the SourceMapGenerator represents a source map which is @@ -93048,7 +93770,7 @@ exports.SourceMapGenerator = SourceMapGenerator; /***/ }), -/* 809 */ +/* 820 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -93088,7 +93810,7 @@ exports.SourceMapGenerator = SourceMapGenerator; * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -var base64 = __webpack_require__(810); +var base64 = __webpack_require__(821); // A single base 64 digit can contain 6 bits of data. For the base 64 variable // length quantities we use in the source map spec, the first bit is the sign, @@ -93194,7 +93916,7 @@ exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { /***/ }), -/* 810 */ +/* 821 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -93267,7 +93989,7 @@ exports.decode = function (charCode) { /***/ }), -/* 811 */ +/* 822 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -93690,7 +94412,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate /***/ }), -/* 812 */ +/* 823 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -93700,7 +94422,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(811); +var util = __webpack_require__(822); var has = Object.prototype.hasOwnProperty; var hasNativeMap = typeof Map !== "undefined"; @@ -93817,7 +94539,7 @@ exports.ArraySet = ArraySet; /***/ }), -/* 813 */ +/* 824 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -93827,7 +94549,7 @@ exports.ArraySet = ArraySet; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(811); +var util = __webpack_require__(822); /** * Determine whether mappingB is after mappingA with respect to generated @@ -93902,7 +94624,7 @@ exports.MappingList = MappingList; /***/ }), -/* 814 */ +/* 825 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -93912,11 +94634,11 @@ exports.MappingList = MappingList; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(811); -var binarySearch = __webpack_require__(815); -var ArraySet = __webpack_require__(812).ArraySet; -var base64VLQ = __webpack_require__(809); -var quickSort = __webpack_require__(816).quickSort; +var util = __webpack_require__(822); +var binarySearch = __webpack_require__(826); +var ArraySet = __webpack_require__(823).ArraySet; +var base64VLQ = __webpack_require__(820); +var quickSort = __webpack_require__(827).quickSort; function SourceMapConsumer(aSourceMap) { var sourceMap = aSourceMap; @@ -94990,7 +95712,7 @@ exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; /***/ }), -/* 815 */ +/* 826 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -95107,7 +95829,7 @@ exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { /***/ }), -/* 816 */ +/* 827 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -95227,7 +95949,7 @@ exports.quickSort = function (ary, comparator) { /***/ }), -/* 817 */ +/* 828 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -95237,8 +95959,8 @@ exports.quickSort = function (ary, comparator) { * http://opensource.org/licenses/BSD-3-Clause */ -var SourceMapGenerator = __webpack_require__(808).SourceMapGenerator; -var util = __webpack_require__(811); +var SourceMapGenerator = __webpack_require__(819).SourceMapGenerator; +var util = __webpack_require__(822); // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other // operating systems these days (capturing the result). @@ -95646,17 +96368,17 @@ exports.SourceNode = SourceNode; /***/ }), -/* 818 */ +/* 829 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014, 2015, 2016, 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var sourceMappingURL = __webpack_require__(819) -var resolveUrl = __webpack_require__(820) -var decodeUriComponent = __webpack_require__(821) -var urix = __webpack_require__(823) -var atob = __webpack_require__(824) +var sourceMappingURL = __webpack_require__(830) +var resolveUrl = __webpack_require__(831) +var decodeUriComponent = __webpack_require__(832) +var urix = __webpack_require__(834) +var atob = __webpack_require__(835) @@ -95954,7 +96676,7 @@ module.exports = { /***/ }), -/* 819 */ +/* 830 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright 2014 Simon Lydell @@ -96017,7 +96739,7 @@ void (function(root, factory) { /***/ }), -/* 820 */ +/* 831 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell @@ -96035,13 +96757,13 @@ module.exports = resolveUrl /***/ }), -/* 821 */ +/* 832 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var decodeUriComponent = __webpack_require__(822) +var decodeUriComponent = __webpack_require__(833) function customDecodeUriComponent(string) { // `decodeUriComponent` turns `+` into ` `, but that's not wanted. @@ -96052,7 +96774,7 @@ module.exports = customDecodeUriComponent /***/ }), -/* 822 */ +/* 833 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -96153,7 +96875,7 @@ module.exports = function (encodedURI) { /***/ }), -/* 823 */ +/* 834 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell @@ -96176,7 +96898,7 @@ module.exports = urix /***/ }), -/* 824 */ +/* 835 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -96190,7 +96912,7 @@ module.exports = atob.atob = atob; /***/ }), -/* 825 */ +/* 836 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -96198,8 +96920,8 @@ module.exports = atob.atob = atob; var fs = __webpack_require__(23); var path = __webpack_require__(16); -var define = __webpack_require__(729); -var utils = __webpack_require__(806); +var define = __webpack_require__(798); +var utils = __webpack_require__(817); /** * Expose `mixin()`. @@ -96342,19 +97064,19 @@ exports.comment = function(node) { /***/ }), -/* 826 */ +/* 837 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(798); +var use = __webpack_require__(809); var util = __webpack_require__(29); -var Cache = __webpack_require__(827); -var define = __webpack_require__(729); -var debug = __webpack_require__(800)('snapdragon:parser'); -var Position = __webpack_require__(828); -var utils = __webpack_require__(806); +var Cache = __webpack_require__(838); +var define = __webpack_require__(798); +var debug = __webpack_require__(811)('snapdragon:parser'); +var Position = __webpack_require__(839); +var utils = __webpack_require__(817); /** * Create a new `Parser` with the given `input` and `options`. @@ -96882,7 +97604,7 @@ module.exports = Parser; /***/ }), -/* 827 */ +/* 838 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -96989,13 +97711,13 @@ MapCache.prototype.del = function mapDelete(key) { /***/ }), -/* 828 */ +/* 839 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(729); +var define = __webpack_require__(798); /** * Store position for a node @@ -97010,16 +97732,16 @@ module.exports = function Position(start, parser) { /***/ }), -/* 829 */ +/* 840 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var safe = __webpack_require__(830); -var define = __webpack_require__(836); -var extend = __webpack_require__(837); -var not = __webpack_require__(839); +var safe = __webpack_require__(841); +var define = __webpack_require__(847); +var extend = __webpack_require__(848); +var not = __webpack_require__(850); var MAX_LENGTH = 1024 * 64; /** @@ -97172,10 +97894,10 @@ module.exports.makeRe = makeRe; /***/ }), -/* 830 */ +/* 841 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(831); +var parse = __webpack_require__(842); var types = parse.types; module.exports = function (re, opts) { @@ -97221,13 +97943,13 @@ function isRegExp (x) { /***/ }), -/* 831 */ +/* 842 */ /***/ (function(module, exports, __webpack_require__) { -var util = __webpack_require__(832); -var types = __webpack_require__(833); -var sets = __webpack_require__(834); -var positions = __webpack_require__(835); +var util = __webpack_require__(843); +var types = __webpack_require__(844); +var sets = __webpack_require__(845); +var positions = __webpack_require__(846); module.exports = function(regexpStr) { @@ -97509,11 +98231,11 @@ module.exports.types = types; /***/ }), -/* 832 */ +/* 843 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(833); -var sets = __webpack_require__(834); +var types = __webpack_require__(844); +var sets = __webpack_require__(845); // All of these are private and only used by randexp. @@ -97626,7 +98348,7 @@ exports.error = function(regexp, msg) { /***/ }), -/* 833 */ +/* 844 */ /***/ (function(module, exports) { module.exports = { @@ -97642,10 +98364,10 @@ module.exports = { /***/ }), -/* 834 */ +/* 845 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(833); +var types = __webpack_require__(844); var INTS = function() { return [{ type: types.RANGE , from: 48, to: 57 }]; @@ -97730,10 +98452,10 @@ exports.anyChar = function() { /***/ }), -/* 835 */ +/* 846 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(833); +var types = __webpack_require__(844); exports.wordBoundary = function() { return { type: types.POSITION, value: 'b' }; @@ -97753,7 +98475,7 @@ exports.end = function() { /***/ }), -/* 836 */ +/* 847 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -97766,8 +98488,8 @@ exports.end = function() { -var isobject = __webpack_require__(747); -var isDescriptor = __webpack_require__(759); +var isobject = __webpack_require__(749); +var isDescriptor = __webpack_require__(763); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -97798,14 +98520,14 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 837 */ +/* 848 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(838); -var assignSymbols = __webpack_require__(748); +var isExtendable = __webpack_require__(849); +var assignSymbols = __webpack_require__(750); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -97865,7 +98587,7 @@ function isEnum(obj, key) { /***/ }), -/* 838 */ +/* 849 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -97878,7 +98600,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(746); +var isPlainObject = __webpack_require__(748); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -97886,14 +98608,14 @@ module.exports = function isExtendable(val) { /***/ }), -/* 839 */ +/* 850 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(837); -var safe = __webpack_require__(830); +var extend = __webpack_require__(848); +var safe = __webpack_require__(841); /** * The main export is a function that takes a `pattern` string and an `options` object. @@ -97965,14 +98687,14 @@ module.exports = toRegex; /***/ }), -/* 840 */ +/* 851 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var nanomatch = __webpack_require__(841); -var extglob = __webpack_require__(856); +var nanomatch = __webpack_require__(852); +var extglob = __webpack_require__(868); module.exports = function(snapdragon) { var compilers = snapdragon.compiler.compilers; @@ -98049,7 +98771,7 @@ function escapeExtglobs(compiler) { /***/ }), -/* 841 */ +/* 852 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98060,17 +98782,17 @@ function escapeExtglobs(compiler) { */ var util = __webpack_require__(29); -var toRegex = __webpack_require__(728); -var extend = __webpack_require__(842); +var toRegex = __webpack_require__(853); +var extend = __webpack_require__(854); /** * Local dependencies */ -var compilers = __webpack_require__(844); -var parsers = __webpack_require__(845); -var cache = __webpack_require__(848); -var utils = __webpack_require__(850); +var compilers = __webpack_require__(856); +var parsers = __webpack_require__(857); +var cache = __webpack_require__(860); +var utils = __webpack_require__(862); var MAX_LENGTH = 1024 * 64; /** @@ -98855,53 +99577,208 @@ function compose(patterns, options, matcher) { }); } -/** - * Memoize a generated regex or function. A unique key is generated - * from the `type` (usually method name), the `pattern`, and - * user-defined options. - */ +/** + * Memoize a generated regex or function. A unique key is generated + * from the `type` (usually method name), the `pattern`, and + * user-defined options. + */ + +function memoize(type, pattern, options, fn) { + var key = utils.createKey(type + '=' + pattern, options); + + if (options && options.cache === false) { + return fn(pattern, options); + } + + if (cache.has(type, key)) { + return cache.get(type, key); + } + + var val = fn(pattern, options); + cache.set(type, key, val); + return val; +} + +/** + * Expose compiler, parser and cache on `nanomatch` + */ + +nanomatch.compilers = compilers; +nanomatch.parsers = parsers; +nanomatch.cache = cache; + +/** + * Expose `nanomatch` + * @type {Function} + */ + +module.exports = nanomatch; + + +/***/ }), +/* 853 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var define = __webpack_require__(798); +var extend = __webpack_require__(740); +var not = __webpack_require__(739); +var MAX_LENGTH = 1024 * 64; + +/** + * Session cache + */ + +var cache = {}; + +/** + * Create a regular expression from the given `pattern` string. + * + * @param {String|RegExp} `pattern` Pattern can be a string or regular expression. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +module.exports = function(patterns, options) { + if (!Array.isArray(patterns)) { + return makeRe(patterns, options); + } + return makeRe(patterns.join('|'), options); +}; + +/** + * Create a regular expression from the given `pattern` string. + * + * @param {String|RegExp} `pattern` Pattern can be a string or regular expression. + * @param {Object} `options` + * @return {RegExp} + * @api public + */ + +function makeRe(pattern, options) { + if (pattern instanceof RegExp) { + return pattern; + } + + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + if (pattern.length > MAX_LENGTH) { + throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters'); + } + + var key = pattern; + // do this before shallow cloning options, it's a lot faster + if (!options || (options && options.cache !== false)) { + key = createKey(pattern, options); + + if (cache.hasOwnProperty(key)) { + return cache[key]; + } + } + + var opts = extend({}, options); + if (opts.contains === true) { + if (opts.negate === true) { + opts.strictNegate = false; + } else { + opts.strict = false; + } + } + + if (opts.strict === false) { + opts.strictOpen = false; + opts.strictClose = false; + } -function memoize(type, pattern, options, fn) { - var key = utils.createKey(type + '=' + pattern, options); + var open = opts.strictOpen !== false ? '^' : ''; + var close = opts.strictClose !== false ? '$' : ''; + var flags = opts.flags || ''; + var regex; - if (options && options.cache === false) { - return fn(pattern, options); + if (opts.nocase === true && !/i/.test(flags)) { + flags += 'i'; } - if (cache.has(type, key)) { - return cache.get(type, key); + try { + if (opts.negate || typeof opts.strictNegate === 'boolean') { + pattern = not.create(pattern, opts); + } + var str = open + '(?:' + pattern + ')' + close; + regex = new RegExp(str, flags); + } catch (err) { + if (opts.strictErrors === true) { + err.key = key; + err.pattern = pattern; + err.originalOptions = options; + err.createdOptions = opts; + throw err; + } + + try { + regex = new RegExp('^' + pattern.replace(/(\W)/g, '\\$1') + '$'); + } catch (err) { + regex = /.^/; //<= match nothing + } } - var val = fn(pattern, options); - cache.set(type, key, val); - return val; + if (opts.cache !== false) { + cacheRegex(regex, key, pattern, opts); + } + return regex; } /** - * Expose compiler, parser and cache on `nanomatch` + * Cache generated regex. This can result in dramatic speed improvements + * and simplify debugging by adding options and pattern to the regex. It can be + * disabled by passing setting `options.cache` to false. */ -nanomatch.compilers = compilers; -nanomatch.parsers = parsers; -nanomatch.cache = cache; +function cacheRegex(regex, key, pattern, options) { + define(regex, 'cached', true); + define(regex, 'pattern', pattern); + define(regex, 'options', options); + define(regex, 'key', key); + cache[key] = regex; +} /** - * Expose `nanomatch` - * @type {Function} + * Create the key to use for memoization. The key is generated + * by iterating over the options and concatenating key-value pairs + * to the pattern string. */ -module.exports = nanomatch; +function createKey(pattern, options) { + if (!options) return pattern; + var key = pattern; + for (var prop in options) { + if (options.hasOwnProperty(prop)) { + key += ';' + prop + '=' + String(options[prop]); + } + } + return key; +} + +/** + * Expose `makeRe` + */ + +module.exports.makeRe = makeRe; /***/ }), -/* 842 */ +/* 854 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(843); -var assignSymbols = __webpack_require__(748); +var isExtendable = __webpack_require__(855); +var assignSymbols = __webpack_require__(750); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -98961,7 +99838,7 @@ function isEnum(obj, key) { /***/ }), -/* 843 */ +/* 855 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -98974,7 +99851,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(746); +var isPlainObject = __webpack_require__(748); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -98982,7 +99859,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 844 */ +/* 856 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99328,15 +100205,15 @@ module.exports = function(nanomatch, options) { /***/ }), -/* 845 */ +/* 857 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var regexNot = __webpack_require__(739); -var toRegex = __webpack_require__(728); -var isOdd = __webpack_require__(846); +var toRegex = __webpack_require__(853); +var isOdd = __webpack_require__(858); /** * Characters to use in negation regex (we want to "not" match @@ -99722,7 +100599,7 @@ module.exports.not = NOT_REGEX; /***/ }), -/* 846 */ +/* 858 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99735,7 +100612,7 @@ module.exports.not = NOT_REGEX; -var isNumber = __webpack_require__(847); +var isNumber = __webpack_require__(859); module.exports = function isOdd(i) { if (!isNumber(i)) { @@ -99749,7 +100626,7 @@ module.exports = function isOdd(i) { /***/ }), -/* 847 */ +/* 859 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99777,14 +100654,14 @@ module.exports = function isNumber(num) { /***/ }), -/* 848 */ +/* 860 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(849))(); +module.exports = new (__webpack_require__(861))(); /***/ }), -/* 849 */ +/* 861 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99797,7 +100674,7 @@ module.exports = new (__webpack_require__(849))(); -var MapCache = __webpack_require__(827); +var MapCache = __webpack_require__(838); /** * Create a new `FragmentCache` with an optional object to use for `caches`. @@ -99919,7 +100796,7 @@ exports = module.exports = FragmentCache; /***/ }), -/* 850 */ +/* 862 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -99932,14 +100809,14 @@ var path = __webpack_require__(16); * Module dependencies */ -var isWindows = __webpack_require__(851)(); -var Snapdragon = __webpack_require__(767); -utils.define = __webpack_require__(852); -utils.diff = __webpack_require__(853); -utils.extend = __webpack_require__(842); -utils.pick = __webpack_require__(854); -utils.typeOf = __webpack_require__(855); -utils.unique = __webpack_require__(740); +var isWindows = __webpack_require__(863)(); +var Snapdragon = __webpack_require__(771); +utils.define = __webpack_require__(864); +utils.diff = __webpack_require__(865); +utils.extend = __webpack_require__(854); +utils.pick = __webpack_require__(866); +utils.typeOf = __webpack_require__(867); +utils.unique = __webpack_require__(742); /** * Returns true if the given value is effectively an empty string @@ -100305,7 +101182,7 @@ utils.unixify = function(options) { /***/ }), -/* 851 */ +/* 863 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! @@ -100333,7 +101210,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ /***/ }), -/* 852 */ +/* 864 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100346,8 +101223,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ -var isobject = __webpack_require__(747); -var isDescriptor = __webpack_require__(759); +var isobject = __webpack_require__(749); +var isDescriptor = __webpack_require__(763); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -100378,7 +101255,7 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 853 */ +/* 865 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100432,7 +101309,7 @@ function diffArray(one, two) { /***/ }), -/* 854 */ +/* 866 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100445,7 +101322,7 @@ function diffArray(one, two) { -var isObject = __webpack_require__(747); +var isObject = __webpack_require__(749); module.exports = function pick(obj, keys) { if (!isObject(obj) && typeof obj !== 'function') { @@ -100474,7 +101351,7 @@ module.exports = function pick(obj, keys) { /***/ }), -/* 855 */ +/* 867 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -100609,7 +101486,7 @@ function isBuffer(val) { /***/ }), -/* 856 */ +/* 868 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -100619,18 +101496,18 @@ function isBuffer(val) { * Module dependencies */ -var extend = __webpack_require__(737); -var unique = __webpack_require__(740); -var toRegex = __webpack_require__(728); +var extend = __webpack_require__(740); +var unique = __webpack_require__(742); +var toRegex = __webpack_require__(853); /** * Local dependencies */ -var compilers = __webpack_require__(857); -var parsers = __webpack_require__(868); -var Extglob = __webpack_require__(871); -var utils = __webpack_require__(870); +var compilers = __webpack_require__(869); +var parsers = __webpack_require__(880); +var Extglob = __webpack_require__(883); +var utils = __webpack_require__(882); var MAX_LENGTH = 1024 * 64; /** @@ -100947,13 +101824,13 @@ module.exports = extglob; /***/ }), -/* 857 */ +/* 869 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(858); +var brackets = __webpack_require__(870); /** * Extglob compilers @@ -101123,7 +102000,7 @@ module.exports = function(extglob) { /***/ }), -/* 858 */ +/* 870 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101133,17 +102010,17 @@ module.exports = function(extglob) { * Local dependencies */ -var compilers = __webpack_require__(859); -var parsers = __webpack_require__(861); +var compilers = __webpack_require__(871); +var parsers = __webpack_require__(873); /** * Module dependencies */ -var debug = __webpack_require__(863)('expand-brackets'); -var extend = __webpack_require__(737); -var Snapdragon = __webpack_require__(767); -var toRegex = __webpack_require__(728); +var debug = __webpack_require__(875)('expand-brackets'); +var extend = __webpack_require__(740); +var Snapdragon = __webpack_require__(771); +var toRegex = __webpack_require__(853); /** * Parses the given POSIX character class `pattern` and returns a @@ -101341,13 +102218,13 @@ module.exports = brackets; /***/ }), -/* 859 */ +/* 871 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var posix = __webpack_require__(860); +var posix = __webpack_require__(872); module.exports = function(brackets) { brackets.compiler @@ -101435,7 +102312,7 @@ module.exports = function(brackets) { /***/ }), -/* 860 */ +/* 872 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -101464,14 +102341,14 @@ module.exports = { /***/ }), -/* 861 */ +/* 873 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(862); -var define = __webpack_require__(729); +var utils = __webpack_require__(874); +var define = __webpack_require__(798); /** * Text regex @@ -101690,13 +102567,13 @@ module.exports.TEXT_REGEX = TEXT_REGEX; /***/ }), -/* 862 */ +/* 874 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var toRegex = __webpack_require__(728); +var toRegex = __webpack_require__(853); var regexNot = __webpack_require__(739); var cached; @@ -101731,7 +102608,7 @@ exports.createRegex = function(pattern, include) { /***/ }), -/* 863 */ +/* 875 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -101740,14 +102617,14 @@ exports.createRegex = function(pattern, include) { */ if (typeof process !== 'undefined' && process.type === 'renderer') { - module.exports = __webpack_require__(864); + module.exports = __webpack_require__(876); } else { - module.exports = __webpack_require__(867); + module.exports = __webpack_require__(879); } /***/ }), -/* 864 */ +/* 876 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -101756,7 +102633,7 @@ if (typeof process !== 'undefined' && process.type === 'renderer') { * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(865); +exports = module.exports = __webpack_require__(877); exports.log = log; exports.formatArgs = formatArgs; exports.save = save; @@ -101938,7 +102815,7 @@ function localstorage() { /***/ }), -/* 865 */ +/* 877 */ /***/ (function(module, exports, __webpack_require__) { @@ -101954,7 +102831,7 @@ exports.coerce = coerce; exports.disable = disable; exports.enable = enable; exports.enabled = enabled; -exports.humanize = __webpack_require__(866); +exports.humanize = __webpack_require__(878); /** * The currently active debug mode names, and names to skip. @@ -102146,7 +103023,7 @@ function coerce(val) { /***/ }), -/* 866 */ +/* 878 */ /***/ (function(module, exports) { /** @@ -102304,7 +103181,7 @@ function plural(ms, n, name) { /***/ }), -/* 867 */ +/* 879 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -102320,7 +103197,7 @@ var util = __webpack_require__(29); * Expose `debug()` as the module. */ -exports = module.exports = __webpack_require__(865); +exports = module.exports = __webpack_require__(877); exports.init = init; exports.log = log; exports.formatArgs = formatArgs; @@ -102499,7 +103376,7 @@ function createWritableStdioStream (fd) { case 'PIPE': case 'TCP': - var net = __webpack_require__(805); + var net = __webpack_require__(816); stream = new net.Socket({ fd: fd, readable: false, @@ -102558,15 +103435,15 @@ exports.enable(load()); /***/ }), -/* 868 */ +/* 880 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(858); -var define = __webpack_require__(869); -var utils = __webpack_require__(870); +var brackets = __webpack_require__(870); +var define = __webpack_require__(881); +var utils = __webpack_require__(882); /** * Characters to use in text regex (we want to "not" match @@ -102721,7 +103598,7 @@ module.exports = parsers; /***/ }), -/* 869 */ +/* 881 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -102734,7 +103611,7 @@ module.exports = parsers; -var isDescriptor = __webpack_require__(759); +var isDescriptor = __webpack_require__(763); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -102759,14 +103636,14 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 870 */ +/* 882 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var regex = __webpack_require__(739); -var Cache = __webpack_require__(849); +var Cache = __webpack_require__(861); /** * Utils @@ -102835,7 +103712,7 @@ utils.createRegex = function(str) { /***/ }), -/* 871 */ +/* 883 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -102845,16 +103722,16 @@ utils.createRegex = function(str) { * Module dependencies */ -var Snapdragon = __webpack_require__(767); -var define = __webpack_require__(869); -var extend = __webpack_require__(737); +var Snapdragon = __webpack_require__(771); +var define = __webpack_require__(881); +var extend = __webpack_require__(740); /** * Local dependencies */ -var compilers = __webpack_require__(857); -var parsers = __webpack_require__(868); +var compilers = __webpack_require__(869); +var parsers = __webpack_require__(880); /** * Customize Snapdragon parser and renderer @@ -102920,16 +103797,16 @@ module.exports = Extglob; /***/ }), -/* 872 */ +/* 884 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extglob = __webpack_require__(856); -var nanomatch = __webpack_require__(841); +var extglob = __webpack_require__(868); +var nanomatch = __webpack_require__(852); var regexNot = __webpack_require__(739); -var toRegex = __webpack_require__(829); +var toRegex = __webpack_require__(840); var not; /** @@ -103010,14 +103887,14 @@ function textRegex(pattern) { /***/ }), -/* 873 */ +/* 885 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(849))(); +module.exports = new (__webpack_require__(861))(); /***/ }), -/* 874 */ +/* 886 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103030,13 +103907,13 @@ var path = __webpack_require__(16); * Module dependencies */ -var Snapdragon = __webpack_require__(767); -utils.define = __webpack_require__(836); -utils.diff = __webpack_require__(853); -utils.extend = __webpack_require__(837); -utils.pick = __webpack_require__(854); -utils.typeOf = __webpack_require__(875); -utils.unique = __webpack_require__(740); +var Snapdragon = __webpack_require__(771); +utils.define = __webpack_require__(847); +utils.diff = __webpack_require__(865); +utils.extend = __webpack_require__(848); +utils.pick = __webpack_require__(866); +utils.typeOf = __webpack_require__(887); +utils.unique = __webpack_require__(742); /** * Returns true if the platform is windows, or `path.sep` is `\\`. @@ -103333,7 +104210,7 @@ utils.unixify = function(options) { /***/ }), -/* 875 */ +/* 887 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -103468,7 +104345,7 @@ function isBuffer(val) { /***/ }), -/* 876 */ +/* 888 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103487,9 +104364,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(877); -var reader_1 = __webpack_require__(890); -var fs_stream_1 = __webpack_require__(894); +var readdir = __webpack_require__(889); +var reader_1 = __webpack_require__(902); +var fs_stream_1 = __webpack_require__(906); var ReaderAsync = /** @class */ (function (_super) { __extends(ReaderAsync, _super); function ReaderAsync() { @@ -103550,15 +104427,15 @@ exports.default = ReaderAsync; /***/ }), -/* 877 */ +/* 889 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const readdirSync = __webpack_require__(878); -const readdirAsync = __webpack_require__(886); -const readdirStream = __webpack_require__(889); +const readdirSync = __webpack_require__(890); +const readdirAsync = __webpack_require__(898); +const readdirStream = __webpack_require__(901); module.exports = exports = readdirAsyncPath; exports.readdir = exports.readdirAsync = exports.async = readdirAsyncPath; @@ -103642,7 +104519,7 @@ function readdirStreamStat (dir, options) { /***/ }), -/* 878 */ +/* 890 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103650,11 +104527,11 @@ function readdirStreamStat (dir, options) { module.exports = readdirSync; -const DirectoryReader = __webpack_require__(879); +const DirectoryReader = __webpack_require__(891); let syncFacade = { - fs: __webpack_require__(884), - forEach: __webpack_require__(885), + fs: __webpack_require__(896), + forEach: __webpack_require__(897), sync: true }; @@ -103683,7 +104560,7 @@ function readdirSync (dir, options, internalOptions) { /***/ }), -/* 879 */ +/* 891 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -103692,9 +104569,9 @@ function readdirSync (dir, options, internalOptions) { const Readable = __webpack_require__(27).Readable; const EventEmitter = __webpack_require__(379).EventEmitter; const path = __webpack_require__(16); -const normalizeOptions = __webpack_require__(880); -const stat = __webpack_require__(882); -const call = __webpack_require__(883); +const normalizeOptions = __webpack_require__(892); +const stat = __webpack_require__(894); +const call = __webpack_require__(895); /** * Asynchronously reads the contents of a directory and streams the results @@ -104070,14 +104947,14 @@ module.exports = DirectoryReader; /***/ }), -/* 880 */ +/* 892 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(16); -const globToRegExp = __webpack_require__(881); +const globToRegExp = __webpack_require__(893); module.exports = normalizeOptions; @@ -104254,7 +105131,7 @@ function normalizeOptions (options, internalOptions) { /***/ }), -/* 881 */ +/* 893 */ /***/ (function(module, exports) { module.exports = function (glob, opts) { @@ -104391,13 +105268,13 @@ module.exports = function (glob, opts) { /***/ }), -/* 882 */ +/* 894 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const call = __webpack_require__(883); +const call = __webpack_require__(895); module.exports = stat; @@ -104472,7 +105349,7 @@ function symlinkStat (fs, path, lstats, callback) { /***/ }), -/* 883 */ +/* 895 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104533,14 +105410,14 @@ function callOnce (fn) { /***/ }), -/* 884 */ +/* 896 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const fs = __webpack_require__(23); -const call = __webpack_require__(883); +const call = __webpack_require__(895); /** * A facade around {@link fs.readdirSync} that allows it to be called @@ -104604,7 +105481,7 @@ exports.lstat = function (path, callback) { /***/ }), -/* 885 */ +/* 897 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104633,7 +105510,7 @@ function syncForEach (array, iterator, done) { /***/ }), -/* 886 */ +/* 898 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104641,12 +105518,12 @@ function syncForEach (array, iterator, done) { module.exports = readdirAsync; -const maybe = __webpack_require__(887); -const DirectoryReader = __webpack_require__(879); +const maybe = __webpack_require__(899); +const DirectoryReader = __webpack_require__(891); let asyncFacade = { fs: __webpack_require__(23), - forEach: __webpack_require__(888), + forEach: __webpack_require__(900), async: true }; @@ -104688,7 +105565,7 @@ function readdirAsync (dir, options, callback, internalOptions) { /***/ }), -/* 887 */ +/* 899 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104715,7 +105592,7 @@ module.exports = function maybe (cb, promise) { /***/ }), -/* 888 */ +/* 900 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104751,7 +105628,7 @@ function asyncForEach (array, iterator, done) { /***/ }), -/* 889 */ +/* 901 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104759,11 +105636,11 @@ function asyncForEach (array, iterator, done) { module.exports = readdirStream; -const DirectoryReader = __webpack_require__(879); +const DirectoryReader = __webpack_require__(891); let streamFacade = { fs: __webpack_require__(23), - forEach: __webpack_require__(888), + forEach: __webpack_require__(900), async: true }; @@ -104783,16 +105660,16 @@ function readdirStream (dir, options, internalOptions) { /***/ }), -/* 890 */ +/* 902 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var path = __webpack_require__(16); -var deep_1 = __webpack_require__(891); -var entry_1 = __webpack_require__(893); -var pathUtil = __webpack_require__(892); +var deep_1 = __webpack_require__(903); +var entry_1 = __webpack_require__(905); +var pathUtil = __webpack_require__(904); var Reader = /** @class */ (function () { function Reader(options) { this.options = options; @@ -104858,13 +105735,13 @@ exports.default = Reader; /***/ }), -/* 891 */ +/* 903 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(892); +var pathUtils = __webpack_require__(904); var patternUtils = __webpack_require__(721); var DeepFilter = /** @class */ (function () { function DeepFilter(options, micromatchOptions) { @@ -104948,7 +105825,7 @@ exports.default = DeepFilter; /***/ }), -/* 892 */ +/* 904 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -104979,13 +105856,13 @@ exports.makeAbsolute = makeAbsolute; /***/ }), -/* 893 */ +/* 905 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(892); +var pathUtils = __webpack_require__(904); var patternUtils = __webpack_require__(721); var EntryFilter = /** @class */ (function () { function EntryFilter(options, micromatchOptions) { @@ -105071,7 +105948,7 @@ exports.default = EntryFilter; /***/ }), -/* 894 */ +/* 906 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105091,8 +105968,8 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var stream = __webpack_require__(27); -var fsStat = __webpack_require__(895); -var fs_1 = __webpack_require__(899); +var fsStat = __webpack_require__(907); +var fs_1 = __webpack_require__(911); var FileSystemStream = /** @class */ (function (_super) { __extends(FileSystemStream, _super); function FileSystemStream() { @@ -105142,14 +106019,14 @@ exports.default = FileSystemStream; /***/ }), -/* 895 */ +/* 907 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const optionsManager = __webpack_require__(896); -const statProvider = __webpack_require__(898); +const optionsManager = __webpack_require__(908); +const statProvider = __webpack_require__(910); /** * Asynchronous API. */ @@ -105180,13 +106057,13 @@ exports.statSync = statSync; /***/ }), -/* 896 */ +/* 908 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsAdapter = __webpack_require__(897); +const fsAdapter = __webpack_require__(909); function prepare(opts) { const options = Object.assign({ fs: fsAdapter.getFileSystemAdapter(opts ? opts.fs : undefined), @@ -105199,7 +106076,7 @@ exports.prepare = prepare; /***/ }), -/* 897 */ +/* 909 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105222,7 +106099,7 @@ exports.getFileSystemAdapter = getFileSystemAdapter; /***/ }), -/* 898 */ +/* 910 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105274,7 +106151,7 @@ exports.isFollowedSymlink = isFollowedSymlink; /***/ }), -/* 899 */ +/* 911 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105305,7 +106182,7 @@ exports.default = FileSystem; /***/ }), -/* 900 */ +/* 912 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105325,9 +106202,9 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var stream = __webpack_require__(27); -var readdir = __webpack_require__(877); -var reader_1 = __webpack_require__(890); -var fs_stream_1 = __webpack_require__(894); +var readdir = __webpack_require__(889); +var reader_1 = __webpack_require__(902); +var fs_stream_1 = __webpack_require__(906); var TransformStream = /** @class */ (function (_super) { __extends(TransformStream, _super); function TransformStream(reader) { @@ -105395,7 +106272,7 @@ exports.default = ReaderStream; /***/ }), -/* 901 */ +/* 913 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105414,9 +106291,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(877); -var reader_1 = __webpack_require__(890); -var fs_sync_1 = __webpack_require__(902); +var readdir = __webpack_require__(889); +var reader_1 = __webpack_require__(902); +var fs_sync_1 = __webpack_require__(914); var ReaderSync = /** @class */ (function (_super) { __extends(ReaderSync, _super); function ReaderSync() { @@ -105476,7 +106353,7 @@ exports.default = ReaderSync; /***/ }), -/* 902 */ +/* 914 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105495,8 +106372,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var fsStat = __webpack_require__(895); -var fs_1 = __webpack_require__(899); +var fsStat = __webpack_require__(907); +var fs_1 = __webpack_require__(911); var FileSystemSync = /** @class */ (function (_super) { __extends(FileSystemSync, _super); function FileSystemSync() { @@ -105542,7 +106419,7 @@ exports.default = FileSystemSync; /***/ }), -/* 903 */ +/* 915 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105558,7 +106435,7 @@ exports.flatten = flatten; /***/ }), -/* 904 */ +/* 916 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105579,13 +106456,13 @@ exports.merge = merge; /***/ }), -/* 905 */ +/* 917 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(16); -const pathType = __webpack_require__(906); +const pathType = __webpack_require__(918); const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; @@ -105651,13 +106528,13 @@ module.exports.sync = (input, opts) => { /***/ }), -/* 906 */ +/* 918 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const fs = __webpack_require__(23); -const pify = __webpack_require__(907); +const pify = __webpack_require__(919); function type(fn, fn2, fp) { if (typeof fp !== 'string') { @@ -105700,7 +106577,7 @@ exports.symlinkSync = typeSync.bind(null, 'lstatSync', 'isSymbolicLink'); /***/ }), -/* 907 */ +/* 919 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105791,7 +106668,7 @@ module.exports = (obj, opts) => { /***/ }), -/* 908 */ +/* 920 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -105799,9 +106676,9 @@ module.exports = (obj, opts) => { const fs = __webpack_require__(23); const path = __webpack_require__(16); const fastGlob = __webpack_require__(717); -const gitIgnore = __webpack_require__(909); -const pify = __webpack_require__(910); -const slash = __webpack_require__(911); +const gitIgnore = __webpack_require__(921); +const pify = __webpack_require__(922); +const slash = __webpack_require__(923); const DEFAULT_IGNORE = [ '**/node_modules/**', @@ -105899,7 +106776,7 @@ module.exports.sync = options => { /***/ }), -/* 909 */ +/* 921 */ /***/ (function(module, exports) { // A simple implementation of make-array @@ -106368,7 +107245,7 @@ module.exports = options => new IgnoreBase(options) /***/ }), -/* 910 */ +/* 922 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106443,7 +107320,7 @@ module.exports = (input, options) => { /***/ }), -/* 911 */ +/* 923 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106461,17 +107338,17 @@ module.exports = input => { /***/ }), -/* 912 */ +/* 924 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(16); const {constants: fsConstants} = __webpack_require__(23); -const pEvent = __webpack_require__(913); -const CpFileError = __webpack_require__(916); -const fs = __webpack_require__(920); -const ProgressEmitter = __webpack_require__(923); +const pEvent = __webpack_require__(925); +const CpFileError = __webpack_require__(928); +const fs = __webpack_require__(932); +const ProgressEmitter = __webpack_require__(935); const cpFileAsync = async (source, destination, options, progressEmitter) => { let readError; @@ -106585,12 +107462,12 @@ module.exports.sync = (source, destination, options) => { /***/ }), -/* 913 */ +/* 925 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pTimeout = __webpack_require__(914); +const pTimeout = __webpack_require__(926); const symbolAsyncIterator = Symbol.asyncIterator || '@@asyncIterator'; @@ -106881,12 +107758,12 @@ module.exports.iterator = (emitter, event, options) => { /***/ }), -/* 914 */ +/* 926 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pFinally = __webpack_require__(915); +const pFinally = __webpack_require__(927); class TimeoutError extends Error { constructor(message) { @@ -106932,7 +107809,7 @@ module.exports.TimeoutError = TimeoutError; /***/ }), -/* 915 */ +/* 927 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -106954,12 +107831,12 @@ module.exports = (promise, onFinally) => { /***/ }), -/* 916 */ +/* 928 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(917); +const NestedError = __webpack_require__(929); class CpFileError extends NestedError { constructor(message, nested) { @@ -106973,10 +107850,10 @@ module.exports = CpFileError; /***/ }), -/* 917 */ +/* 929 */ /***/ (function(module, exports, __webpack_require__) { -var inherits = __webpack_require__(918); +var inherits = __webpack_require__(930); var NestedError = function (message, nested) { this.nested = nested; @@ -107027,7 +107904,7 @@ module.exports = NestedError; /***/ }), -/* 918 */ +/* 930 */ /***/ (function(module, exports, __webpack_require__) { try { @@ -107035,12 +107912,12 @@ try { if (typeof util.inherits !== 'function') throw ''; module.exports = util.inherits; } catch (e) { - module.exports = __webpack_require__(919); + module.exports = __webpack_require__(931); } /***/ }), -/* 919 */ +/* 931 */ /***/ (function(module, exports) { if (typeof Object.create === 'function') { @@ -107069,16 +107946,16 @@ if (typeof Object.create === 'function') { /***/ }), -/* 920 */ +/* 932 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const {promisify} = __webpack_require__(29); const fs = __webpack_require__(22); -const makeDir = __webpack_require__(921); -const pEvent = __webpack_require__(913); -const CpFileError = __webpack_require__(916); +const makeDir = __webpack_require__(933); +const pEvent = __webpack_require__(925); +const CpFileError = __webpack_require__(928); const stat = promisify(fs.stat); const lstat = promisify(fs.lstat); @@ -107175,7 +108052,7 @@ exports.copyFileSync = (source, destination, flags) => { /***/ }), -/* 921 */ +/* 933 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -107183,7 +108060,7 @@ exports.copyFileSync = (source, destination, flags) => { const fs = __webpack_require__(23); const path = __webpack_require__(16); const {promisify} = __webpack_require__(29); -const semver = __webpack_require__(922); +const semver = __webpack_require__(934); const defaults = { mode: 0o777 & (~process.umask()), @@ -107332,7 +108209,7 @@ module.exports.sync = (input, options) => { /***/ }), -/* 922 */ +/* 934 */ /***/ (function(module, exports) { exports = module.exports = SemVer @@ -108934,7 +109811,7 @@ function coerce (version, options) { /***/ }), -/* 923 */ +/* 935 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -108975,7 +109852,7 @@ module.exports = ProgressEmitter; /***/ }), -/* 924 */ +/* 936 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -109021,12 +109898,12 @@ exports.default = module.exports; /***/ }), -/* 925 */ +/* 937 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(926); +const NestedError = __webpack_require__(938); class CpyError extends NestedError { constructor(message, nested) { @@ -109040,7 +109917,7 @@ module.exports = CpyError; /***/ }), -/* 926 */ +/* 938 */ /***/ (function(module, exports, __webpack_require__) { var inherits = __webpack_require__(29).inherits; @@ -109096,7 +109973,7 @@ module.exports = NestedError; /***/ }), -/* 927 */ +/* 939 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; diff --git a/yarn.lock b/yarn.lock index 8653d62ef5120..259ecc92f482c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6412,11 +6412,6 @@ array-reduce@~0.0.0: resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= -array-slice@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" - integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= - array-slice@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" @@ -6448,11 +6443,6 @@ array-uniq@^1.0.0, array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -6679,7 +6669,7 @@ async@^2.6.0, async@^2.6.1: dependencies: lodash "^4.17.10" -async@^2.6.3: +async@^2.6.2, async@^2.6.3: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -7573,7 +7563,7 @@ bluebird@3.7.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bluebird@^3.3.0, bluebird@^3.3.1: +bluebird@^3.3.1: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== @@ -7768,13 +7758,6 @@ brace@0.11.1, brace@^0.11.0, brace@^0.11.1: resolved "https://registry.yarnpkg.com/brace/-/brace-0.11.1.tgz#4896fcc9d544eef45f4bb7660db320d3b379fe58" integrity sha1-SJb8ydVE7vRfS7dmDbMg07N5/lg= -braces@^0.1.2: - version "0.1.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" - integrity sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY= - dependencies: - expand-range "^0.1.0" - braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -7791,7 +7774,7 @@ braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -8696,7 +8679,7 @@ cheerio@^1.0.0-rc.3: lodash "^4.15.0" parse5 "^3.0.1" -chokidar@2.1.2, chokidar@^2.0.2, chokidar@^2.0.3, chokidar@^2.0.4: +chokidar@2.1.2, chokidar@^2.0.2, chokidar@^2.0.4: version "2.1.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.2.tgz#9c23ea40b01638439e0513864d362aeacc5ad058" integrity sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg== @@ -8764,7 +8747,7 @@ chokidar@^2.0.0, chokidar@^2.1.2, chokidar@^2.1.8: optionalDependencies: fsevents "^1.2.7" -chokidar@^3.2.2: +chokidar@^3.0.0, chokidar@^3.2.2: version "3.3.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== @@ -8843,11 +8826,6 @@ circular-json@^0.3.1: resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== -circular-json@^0.5.5: - version "0.5.9" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" - integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== - class-extend@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/class-extend/-/class-extend-0.1.2.tgz#8057a82b00f53f82a5d62c50ef8cffdec6fabc34" @@ -9312,13 +9290,6 @@ colorspace@1.1.x: color "3.0.x" text-hex "1.0.x" -combine-lists@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" - integrity sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y= - dependencies: - lodash "^4.5.0" - combined-stream@^1.0.5: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -9868,7 +9839,7 @@ core-js@^1.0.0: resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= -core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.1, core-js@^2.5.3, core-js@^2.6.5, core-js@^2.6.9: +core-js@^2.4.0, core-js@^2.5.0, core-js@^2.5.1, core-js@^2.5.3, core-js@^2.6.5, core-js@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== @@ -10747,10 +10718,10 @@ date-fns@^1.27.2: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" integrity sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw== -date-format@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-1.2.0.tgz#615e828e233dd1ab9bb9ae0950e0ceccfa6ecad8" - integrity sha1-YV6CjiM90aubua4JUODOzPpuytg= +date-format@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" + integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== date-now@^0.1.4: version "0.1.4" @@ -12995,15 +12966,6 @@ exit@^0.1.2, exit@~0.1.1: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expand-braces@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" - integrity sha1-SIsdHSRRyz06axks/AMPRMWFX+o= - dependencies: - array-slice "^0.2.3" - array-unique "^0.2.1" - braces "^0.1.2" - expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" @@ -13017,14 +12979,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-range@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" - integrity sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ= - dependencies: - is-number "^0.1.1" - repeat-string "^0.2.2" - expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -17302,11 +17256,6 @@ is-number-object@^1.0.4: resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== -is-number@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" - integrity sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY= - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -17632,10 +17581,10 @@ isbinaryfile@4.0.2: resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.2.tgz#bfc45642da645681c610cca831022e30af426488" integrity sha512-C3FSxJdNrEr2F4z6uFtNzECDM5hXk+46fxaa+cwBe5/XrWSmzdG8DDgyjfX6/NRdBB21q2JXuRAzPCUs+fclnQ== -isbinaryfile@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" - integrity sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE= +isbinaryfile@^4.0.2: + version "4.0.6" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.6.tgz#edcb62b224e2b4710830b67498c8e4e5a4d2610b" + integrity sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg== isemail@3.x.x: version "3.1.4" @@ -18845,39 +18794,35 @@ karma-safari-launcher@1.0.0: resolved "https://registry.yarnpkg.com/karma-safari-launcher/-/karma-safari-launcher-1.0.0.tgz#96982a2cc47d066aae71c553babb28319115a2ce" integrity sha1-lpgqLMR9BmquccVTursoMZEVos4= -karma@3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/karma/-/karma-3.1.4.tgz#3890ca9722b10d1d14b726e1335931455788499e" - integrity sha512-31Vo8Qr5glN+dZEVIpnPCxEGleqE0EY6CtC2X9TagRV3rRQ3SNrvfhddICkJgUK3AgqpeKSZau03QumTGhGoSw== +karma@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/karma/-/karma-5.0.2.tgz#e404373dac6e3fa08409ae4d9eda7d83adb43ee5" + integrity sha512-RpUuCuGJfN3WnjYPGIH+VBF8023Lfm3TQH6D1kcNL+FxtEPc2UUz/nVjbVAGXH4Pm+Q7FVOAQjdAeFUpXpQ3IA== dependencies: - bluebird "^3.3.0" body-parser "^1.16.1" - chokidar "^2.0.3" + braces "^3.0.2" + chokidar "^3.0.0" colors "^1.1.0" - combine-lists "^1.0.0" connect "^3.6.0" - core-js "^2.2.0" di "^0.0.1" dom-serialize "^2.2.0" - expand-braces "^0.1.1" flatted "^2.0.0" glob "^7.1.1" graceful-fs "^4.1.2" http-proxy "^1.13.0" - isbinaryfile "^3.0.0" - lodash "^4.17.5" - log4js "^3.0.0" + isbinaryfile "^4.0.2" + lodash "^4.17.14" + log4js "^4.0.0" mime "^2.3.1" minimatch "^3.0.2" - optimist "^0.6.1" qjobs "^1.1.4" range-parser "^1.2.0" rimraf "^2.6.0" - safe-buffer "^5.0.1" socket.io "2.1.1" source-map "^0.6.1" tmp "0.0.33" - useragent "2.3.0" + ua-parser-js "0.7.21" + yargs "^15.3.1" kdbush@^3.0.0: version "3.0.0" @@ -19742,7 +19687,7 @@ lodash.uniqby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= -lodash@4.17.11, lodash@4.17.15, lodash@>4.17.4, lodash@^4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10.0, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.0, lodash@^4.6.1, lodash@~4.17.10, lodash@~4.17.15, lodash@~4.17.5: +lodash@4.17.11, lodash@4.17.15, lodash@>4.17.4, lodash@^4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.10.0, lodash@^4.11.1, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.6.1, lodash@~4.17.10, lodash@~4.17.15, lodash@~4.17.5: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== @@ -19803,16 +19748,16 @@ log-update@^1.0.2: ansi-escapes "^1.0.0" cli-cursor "^1.0.2" -log4js@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-3.0.6.tgz#e6caced94967eeeb9ce399f9f8682a4b2b28c8ff" - integrity sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ== +log4js@^4.0.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-4.5.1.tgz#e543625e97d9e6f3e6e7c9fc196dd6ab2cae30b5" + integrity sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw== dependencies: - circular-json "^0.5.5" - date-format "^1.2.0" - debug "^3.1.0" - rfdc "^1.1.2" - streamroller "0.7.0" + date-format "^2.0.0" + debug "^4.1.1" + flatted "^2.0.0" + rfdc "^1.1.4" + streamroller "^1.0.6" logform@^2.1.1: version "2.1.2" @@ -25110,7 +25055,7 @@ readable-stream@1.0, "readable-stream@>=1.0.33-1 <1.1.0-0": string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -25664,11 +25609,6 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" integrity sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= -repeat-string@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" - integrity sha1-x6jTI2BoNiBZp+RlH8aITosftK4= - repeat-string@^1.5.0, repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" @@ -26229,10 +26169,10 @@ rework@1.0.1: convert-source-map "^0.3.3" css "^2.0.0" -rfdc@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.2.tgz#e6e72d74f5dc39de8f538f65e00c36c18018e349" - integrity sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA== +rfdc@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.4.tgz#ba72cc1367a0ccd9cf81a870b3b58bd3ad07f8c2" + integrity sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug== right-align@^0.1.1: version "0.1.3" @@ -27899,15 +27839,16 @@ stream-spigot@~2.1.2: dependencies: readable-stream "~1.1.0" -streamroller@0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.7.0.tgz#a1d1b7cf83d39afb0d63049a5acbf93493bdf64b" - integrity sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ== +streamroller@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-1.0.6.tgz#8167d8496ed9f19f05ee4b158d9611321b8cacd9" + integrity sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg== dependencies: - date-format "^1.2.0" - debug "^3.1.0" - mkdirp "^0.5.1" - readable-stream "^2.3.0" + async "^2.6.2" + date-format "^2.0.0" + debug "^3.2.6" + fs-extra "^7.0.1" + lodash "^4.17.14" strict-uri-encode@^1.0.0: version "1.1.0" @@ -30064,10 +30005,10 @@ typings-tester@^0.3.2: dependencies: commander "^2.12.2" -ua-parser-js@^0.7.18, ua-parser-js@^0.7.9: - version "0.7.19" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.19.tgz#94151be4c0a7fb1d001af7022fdaca4642659e4b" - integrity sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ== +ua-parser-js@0.7.21, ua-parser-js@^0.7.18, ua-parser-js@^0.7.9: + version "0.7.21" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" + integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.5" @@ -30636,7 +30577,7 @@ user-home@^2.0.0: dependencies: os-homedir "^1.0.0" -useragent@2.3.0, useragent@^2.3.0: +useragent@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972" integrity sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw== From b666f0acc879eb34a5cb62ef1ff540546235af06 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Mon, 27 Apr 2020 08:44:42 +0200 Subject: [PATCH 16/26] Bump gonzales-pe dev-dependency from 4.2.4 to 4.3.0 (#64401) --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 259ecc92f482c..16c255e266a47 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14886,11 +14886,11 @@ gonzales-pe-sl@^4.2.3: minimist "1.1.x" gonzales-pe@^4.2.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.2.4.tgz#356ae36a312c46fe0f1026dd6cb539039f8500d2" - integrity sha512-v0Ts/8IsSbh9n1OJRnSfa7Nlxi4AkXIsWB6vPept8FDbL4bXn3FNuxjYtO/nmBGu7GDkL9MFeGebeSu6l55EPQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" + integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== dependencies: - minimist "1.1.x" + minimist "^1.2.5" good-listener@^1.2.2: version "1.2.2" From 3aa73d12362c35d82931accb7fa88606dcf09ea0 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Mon, 27 Apr 2020 08:47:19 +0200 Subject: [PATCH 17/26] Bump @hapi/boom dependency from 7.4.2 to 7.4.11 (#64433) --- yarn.lock | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index 16c255e266a47..93b9bbe127d34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1538,11 +1538,11 @@ through2 "^2.0.3" "@hapi/boom@7.x.x": - version "7.4.2" - resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-7.4.2.tgz#c16957cd09796f6c1bfb4031bdc39d66d6d750c3" - integrity sha512-T2CYcTI0AqSvC6YC7keu/fh9LVSMzfoMLharBnPbOwmc+Cexj9joIc5yNDKunaxYq9LPuOwMS0f2B3S1tFQUNw== + version "7.4.11" + resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-7.4.11.tgz#37af8417eb9416aef3367aa60fa04a1a9f1fc262" + integrity sha512-VSU/Cnj1DXouukYxxkes4nNJonCnlogHvIff1v1RVoN4xzkKhMXX+GRmb3NyH1iar10I9WFPDv2JPwfH3GaV0A== dependencies: - "@hapi/hoek" "6.x.x" + "@hapi/hoek" "8.x.x" "@hapi/bourne@1.x.x": version "1.3.2" @@ -1557,11 +1557,6 @@ "@hapi/hoek" "8.x.x" fast-safe-stringify "2.x.x" -"@hapi/hoek@6.x.x": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-6.2.1.tgz#d3a66329159af879bfdf0b0cff2229c43c5a3451" - integrity sha512-+ryw4GU9pjr1uT6lBuErHJg3NYqzwJTvZ75nKuJijEzpd00Uqi6oiawTGDDf5Hl0zWmI7qHfOtaqB0kpQZJQzA== - "@hapi/hoek@8.x.x": version "8.5.1" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" From 568f7034ebf8c1038146f9a86c82330b7b114c9c Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Mon, 27 Apr 2020 09:40:14 +0200 Subject: [PATCH 18/26] Fix issue with yarn.lock (#64496) This was brought on by merging #64401, #64403, #64406, and #64433. --- yarn.lock | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/yarn.lock b/yarn.lock index 93b9bbe127d34..866aa7255baaa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20589,11 +20589,6 @@ minimist@^1.2.5: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - minimost@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimost/-/minimost-1.0.0.tgz#1d07954aa0268873408b95552fbffc5977dfc78b" @@ -22051,14 +22046,6 @@ optimism@^0.9.0: dependencies: "@wry/context" "^0.4.0" -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - optional-js@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/optional-js/-/optional-js-2.1.1.tgz#c2dc519ad119648510b4d241dbb60b1167c36a46" @@ -31850,11 +31837,6 @@ wordwrap@^1.0.0, wordwrap@~1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" From 3d78b1bcf9b445f709f26311b923068083dffa00 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Mon, 27 Apr 2020 10:02:40 +0200 Subject: [PATCH 19/26] Remove SO autocreateindex error and error page (#64037) * remove autocreateIndex error and error page * update generated doc * delete unused keys * remove sass import * add missing graph import * remove unused method --- .../core/server/kibana-plugin-core-server.md | 2 +- ...-core-server.savedobjectsclientcontract.md | 4 - ...rorhelpers.createesautocreateindexerror.md | 15 --- ...tserrorhelpers.isesautocreateindexerror.md | 22 ----- ...in-core-server.savedobjectserrorhelpers.md | 2 - .../saved_objects/saved_objects_client.ts | 18 +--- .../saved_objects/service/lib/errors.test.ts | 39 -------- .../saved_objects/service/lib/errors.ts | 14 --- .../saved_objects/service/lib/repository.ts | 53 +++++------ src/core/server/saved_objects/types.ts | 9 -- src/core/server/server.api.md | 4 - src/legacy/ui/public/_index.scss | 1 - .../_error_auto_create_index.scss | 3 - .../error_auto_create_index/_index.scss | 1 - .../error_auto_create_index.html | 69 -------------- .../error_auto_create_index.test.js | 95 ------------------- .../error_auto_create_index.test.mocks.js | 22 ----- .../error_auto_create_index.ts | 47 --------- .../public/error_auto_create_index/index.ts | 20 ---- .../translations/translations/ja-JP.json | 11 --- .../translations/translations/zh-CN.json | 11 --- 21 files changed, 24 insertions(+), 438 deletions(-) delete mode 100644 docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.createesautocreateindexerror.md delete mode 100644 docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.isesautocreateindexerror.md delete mode 100644 src/legacy/ui/public/error_auto_create_index/_error_auto_create_index.scss delete mode 100644 src/legacy/ui/public/error_auto_create_index/_index.scss delete mode 100644 src/legacy/ui/public/error_auto_create_index/error_auto_create_index.html delete mode 100644 src/legacy/ui/public/error_auto_create_index/error_auto_create_index.test.js delete mode 100644 src/legacy/ui/public/error_auto_create_index/error_auto_create_index.test.mocks.js delete mode 100644 src/legacy/ui/public/error_auto_create_index/error_auto_create_index.ts delete mode 100644 src/legacy/ui/public/error_auto_create_index/index.ts diff --git a/docs/development/core/server/kibana-plugin-core-server.md b/docs/development/core/server/kibana-plugin-core-server.md index 5450e84417f89..b8cffb36b821a 100644 --- a/docs/development/core/server/kibana-plugin-core-server.md +++ b/docs/development/core/server/kibana-plugin-core-server.md @@ -264,7 +264,7 @@ The plugin integrates with the core system via lifecycle events: `setup` | [SavedObjectAttributeSingle](./kibana-plugin-core-server.savedobjectattributesingle.md) | Don't use this type, it's simply a helper type for [SavedObjectAttribute](./kibana-plugin-core-server.savedobjectattribute.md) | | [SavedObjectMigrationFn](./kibana-plugin-core-server.savedobjectmigrationfn.md) | A migration function for a [saved object type](./kibana-plugin-core-server.savedobjectstype.md) used to migrate it to a given version | | [SavedObjectSanitizedDoc](./kibana-plugin-core-server.savedobjectsanitizeddoc.md) | | -| [SavedObjectsClientContract](./kibana-plugin-core-server.savedobjectsclientcontract.md) | Saved Objects is Kibana's data persisentence mechanism allowing plugins to use Elasticsearch for storing plugin state.\#\# SavedObjectsClient errorsSince the SavedObjectsClient has its hands in everything we are a little paranoid about the way we present errors back to to application code. Ideally, all errors will be either:1. Caused by bad implementation (ie. undefined is not a function) and as such unpredictable 2. An error that has been classified and decorated appropriately by the decorators in [SavedObjectsErrorHelpers](./kibana-plugin-core-server.savedobjectserrorhelpers.md)Type 1 errors are inevitable, but since all expected/handle-able errors should be Type 2 the isXYZError() helpers exposed at SavedObjectsErrorHelpers should be used to understand and manage error responses from the SavedObjectsClient.Type 2 errors are decorated versions of the source error, so if the elasticsearch client threw an error it will be decorated based on its type. That means that rather than looking for error.body.error.type or doing substring checks on error.body.error.reason, just use the helpers to understand the meaning of the error:\`\`\`js if (SavedObjectsErrorHelpers.isNotFoundError(error)) { // handle 404 }if (SavedObjectsErrorHelpers.isNotAuthorizedError(error)) { // 401 handling should be automatic, but in case you wanted to know }// always rethrow the error unless you handle it throw error; \`\`\`\#\#\# 404s from missing indexFrom the perspective of application code and APIs the SavedObjectsClient is a black box that persists objects. One of the internal details that users have no control over is that we use an elasticsearch index for persistance and that index might be missing.At the time of writing we are in the process of transitioning away from the operating assumption that the SavedObjects index is always available. Part of this transition is handling errors resulting from an index missing. These used to trigger a 500 error in most cases, and in others cause 404s with different error messages.From my (Spencer) perspective, a 404 from the SavedObjectsApi is a 404; The object the request/call was targeting could not be found. This is why \#14141 takes special care to ensure that 404 errors are generic and don't distinguish between index missing or document missing.\#\#\# 503s from missing indexUnlike all other methods, create requests are supposed to succeed even when the Kibana index does not exist because it will be automatically created by elasticsearch. When that is not the case it is because Elasticsearch's action.auto_create_index setting prevents it from being created automatically so we throw a special 503 with the intention of informing the user that their Elasticsearch settings need to be updated.See [SavedObjectsClient](./kibana-plugin-core-server.savedobjectsclient.md) See [SavedObjectsErrorHelpers](./kibana-plugin-core-server.savedobjectserrorhelpers.md) | +| [SavedObjectsClientContract](./kibana-plugin-core-server.savedobjectsclientcontract.md) | Saved Objects is Kibana's data persisentence mechanism allowing plugins to use Elasticsearch for storing plugin state.\#\# SavedObjectsClient errorsSince the SavedObjectsClient has its hands in everything we are a little paranoid about the way we present errors back to to application code. Ideally, all errors will be either:1. Caused by bad implementation (ie. undefined is not a function) and as such unpredictable 2. An error that has been classified and decorated appropriately by the decorators in [SavedObjectsErrorHelpers](./kibana-plugin-core-server.savedobjectserrorhelpers.md)Type 1 errors are inevitable, but since all expected/handle-able errors should be Type 2 the isXYZError() helpers exposed at SavedObjectsErrorHelpers should be used to understand and manage error responses from the SavedObjectsClient.Type 2 errors are decorated versions of the source error, so if the elasticsearch client threw an error it will be decorated based on its type. That means that rather than looking for error.body.error.type or doing substring checks on error.body.error.reason, just use the helpers to understand the meaning of the error:\`\`\`js if (SavedObjectsErrorHelpers.isNotFoundError(error)) { // handle 404 }if (SavedObjectsErrorHelpers.isNotAuthorizedError(error)) { // 401 handling should be automatic, but in case you wanted to know }// always rethrow the error unless you handle it throw error; \`\`\`\#\#\# 404s from missing indexFrom the perspective of application code and APIs the SavedObjectsClient is a black box that persists objects. One of the internal details that users have no control over is that we use an elasticsearch index for persistance and that index might be missing.At the time of writing we are in the process of transitioning away from the operating assumption that the SavedObjects index is always available. Part of this transition is handling errors resulting from an index missing. These used to trigger a 500 error in most cases, and in others cause 404s with different error messages.From my (Spencer) perspective, a 404 from the SavedObjectsApi is a 404; The object the request/call was targeting could not be found. This is why \#14141 takes special care to ensure that 404 errors are generic and don't distinguish between index missing or document missing.See [SavedObjectsClient](./kibana-plugin-core-server.savedobjectsclient.md) See [SavedObjectsErrorHelpers](./kibana-plugin-core-server.savedobjectserrorhelpers.md) | | [SavedObjectsClientFactory](./kibana-plugin-core-server.savedobjectsclientfactory.md) | Describes the factory used to create instances of the Saved Objects Client. | | [SavedObjectsClientFactoryProvider](./kibana-plugin-core-server.savedobjectsclientfactoryprovider.md) | Provider to invoke to retrieve a [SavedObjectsClientFactory](./kibana-plugin-core-server.savedobjectsclientfactory.md). | | [SavedObjectsClientWrapperFactory](./kibana-plugin-core-server.savedobjectsclientwrapperfactory.md) | Describes the factory used to create instances of Saved Objects Client Wrappers. | diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectsclientcontract.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectsclientcontract.md index c39df0655f1d4..610356a733126 100644 --- a/docs/development/core/server/kibana-plugin-core-server.savedobjectsclientcontract.md +++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectsclientcontract.md @@ -30,10 +30,6 @@ At the time of writing we are in the process of transitioning away from the oper From my (Spencer) perspective, a 404 from the SavedObjectsApi is a 404; The object the request/call was targeting could not be found. This is why \#14141 takes special care to ensure that 404 errors are generic and don't distinguish between index missing or document missing. -\#\#\# 503s from missing index - -Unlike all other methods, create requests are supposed to succeed even when the Kibana index does not exist because it will be automatically created by elasticsearch. When that is not the case it is because Elasticsearch's `action.auto_create_index` setting prevents it from being created automatically so we throw a special 503 with the intention of informing the user that their Elasticsearch settings need to be updated. - See [SavedObjectsClient](./kibana-plugin-core-server.savedobjectsclient.md) See [SavedObjectsErrorHelpers](./kibana-plugin-core-server.savedobjectserrorhelpers.md) Signature: diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.createesautocreateindexerror.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.createesautocreateindexerror.md deleted file mode 100644 index 6350afacee2ba..0000000000000 --- a/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.createesautocreateindexerror.md +++ /dev/null @@ -1,15 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SavedObjectsErrorHelpers](./kibana-plugin-core-server.savedobjectserrorhelpers.md) > [createEsAutoCreateIndexError](./kibana-plugin-core-server.savedobjectserrorhelpers.createesautocreateindexerror.md) - -## SavedObjectsErrorHelpers.createEsAutoCreateIndexError() method - -Signature: - -```typescript -static createEsAutoCreateIndexError(): DecoratedError; -``` -Returns: - -`DecoratedError` - diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.isesautocreateindexerror.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.isesautocreateindexerror.md deleted file mode 100644 index bdffff5c1365b..0000000000000 --- a/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.isesautocreateindexerror.md +++ /dev/null @@ -1,22 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SavedObjectsErrorHelpers](./kibana-plugin-core-server.savedobjectserrorhelpers.md) > [isEsAutoCreateIndexError](./kibana-plugin-core-server.savedobjectserrorhelpers.isesautocreateindexerror.md) - -## SavedObjectsErrorHelpers.isEsAutoCreateIndexError() method - -Signature: - -```typescript -static isEsAutoCreateIndexError(error: Error | DecoratedError): boolean; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| error | Error | DecoratedError | | - -Returns: - -`boolean` - diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.md index 250b9d3899670..7874be311d52c 100644 --- a/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.md +++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectserrorhelpers.md @@ -17,7 +17,6 @@ export declare class SavedObjectsErrorHelpers | --- | --- | --- | | [createBadRequestError(reason)](./kibana-plugin-core-server.savedobjectserrorhelpers.createbadrequesterror.md) | static | | | [createConflictError(type, id)](./kibana-plugin-core-server.savedobjectserrorhelpers.createconflicterror.md) | static | | -| [createEsAutoCreateIndexError()](./kibana-plugin-core-server.savedobjectserrorhelpers.createesautocreateindexerror.md) | static | | | [createGenericNotFoundError(type, id)](./kibana-plugin-core-server.savedobjectserrorhelpers.creategenericnotfounderror.md) | static | | | [createInvalidVersionError(versionInput)](./kibana-plugin-core-server.savedobjectserrorhelpers.createinvalidversionerror.md) | static | | | [createUnsupportedTypeError(type)](./kibana-plugin-core-server.savedobjectserrorhelpers.createunsupportedtypeerror.md) | static | | @@ -31,7 +30,6 @@ export declare class SavedObjectsErrorHelpers | [decorateRequestEntityTooLargeError(error, reason)](./kibana-plugin-core-server.savedobjectserrorhelpers.decoraterequestentitytoolargeerror.md) | static | | | [isBadRequestError(error)](./kibana-plugin-core-server.savedobjectserrorhelpers.isbadrequesterror.md) | static | | | [isConflictError(error)](./kibana-plugin-core-server.savedobjectserrorhelpers.isconflicterror.md) | static | | -| [isEsAutoCreateIndexError(error)](./kibana-plugin-core-server.savedobjectserrorhelpers.isesautocreateindexerror.md) | static | | | [isEsCannotExecuteScriptError(error)](./kibana-plugin-core-server.savedobjectserrorhelpers.isescannotexecutescripterror.md) | static | | | [isEsUnavailableError(error)](./kibana-plugin-core-server.savedobjectserrorhelpers.isesunavailableerror.md) | static | | | [isForbiddenError(error)](./kibana-plugin-core-server.savedobjectserrorhelpers.isforbiddenerror.md) | static | | diff --git a/src/core/public/saved_objects/saved_objects_client.ts b/src/core/public/saved_objects/saved_objects_client.ts index d26cadecb184a..7958a4f8134d3 100644 --- a/src/core/public/saved_objects/saved_objects_client.ts +++ b/src/core/public/saved_objects/saved_objects_client.ts @@ -216,17 +216,7 @@ export class SavedObjectsClient { }), }); - return createRequest - .then(resp => this.createSavedObject(resp)) - .catch((error: object) => { - if (isAutoCreateIndexError(error)) { - window.location.assign( - this.http.basePath.prepend('/app/kibana#/error/action.auto_create_index') - ); - } - - throw error; - }); + return createRequest.then(resp => this.createSavedObject(resp)); }; /** @@ -468,9 +458,3 @@ const renameKeys = , U extends Record ...{ [keysMap[key] || key]: obj[key] }, }; }, {}); - -const isAutoCreateIndexError = (error: any) => { - return ( - error?.res?.status === 503 && error?.body?.attributes?.code === 'ES_AUTO_CREATE_INDEX_ERROR' - ); -}; diff --git a/src/core/server/saved_objects/service/lib/errors.test.ts b/src/core/server/saved_objects/service/lib/errors.test.ts index 4a43835d795d1..324d19e279212 100644 --- a/src/core/server/saved_objects/service/lib/errors.test.ts +++ b/src/core/server/saved_objects/service/lib/errors.test.ts @@ -403,43 +403,4 @@ describe('savedObjectsClient/errorTypes', () => { }); }); }); - - describe('EsAutoCreateIndex error', () => { - describe('createEsAutoCreateIndexError', () => { - it('does not take an error argument', () => { - const error = new Error(); - // @ts-ignore - expect(SavedObjectsErrorHelpers.createEsAutoCreateIndexError(error)).not.toBe(error); - }); - - it('returns a new Error', () => { - expect(SavedObjectsErrorHelpers.createEsAutoCreateIndexError()).toBeInstanceOf(Error); - }); - - it('makes errors identifiable as EsAutoCreateIndex errors', () => { - expect( - SavedObjectsErrorHelpers.isEsAutoCreateIndexError( - SavedObjectsErrorHelpers.createEsAutoCreateIndexError() - ) - ).toBe(true); - }); - - it('returns a boom error', () => { - const error = SavedObjectsErrorHelpers.createEsAutoCreateIndexError(); - expect(error).toHaveProperty('isBoom', true); - }); - - describe('error.output', () => { - it('uses "Automatic index creation failed" message', () => { - const error = SavedObjectsErrorHelpers.createEsAutoCreateIndexError(); - expect(error.output.payload).toHaveProperty('message', 'Automatic index creation failed'); - }); - - it('sets statusCode to 503', () => { - const error = SavedObjectsErrorHelpers.createEsAutoCreateIndexError(); - expect(error.output).toHaveProperty('statusCode', 503); - }); - }); - }); - }); }); diff --git a/src/core/server/saved_objects/service/lib/errors.ts b/src/core/server/saved_objects/service/lib/errors.ts index 478c6b6d26d53..9614d692741e0 100644 --- a/src/core/server/saved_objects/service/lib/errors.ts +++ b/src/core/server/saved_objects/service/lib/errors.ts @@ -37,8 +37,6 @@ const CODE_CONFLICT = 'SavedObjectsClient/conflict'; const CODE_ES_CANNOT_EXECUTE_SCRIPT = 'SavedObjectsClient/esCannotExecuteScript'; // 503 - Es Unavailable const CODE_ES_UNAVAILABLE = 'SavedObjectsClient/esUnavailable'; -// 503 - Unable to automatically create index because of action.auto_create_index setting -const CODE_ES_AUTO_CREATE_INDEX_ERROR = 'SavedObjectsClient/autoCreateIndex'; // 500 - General Error const CODE_GENERAL_ERROR = 'SavedObjectsClient/generalError'; @@ -180,18 +178,6 @@ export class SavedObjectsErrorHelpers { return isSavedObjectsClientError(error) && error[code] === CODE_ES_UNAVAILABLE; } - public static createEsAutoCreateIndexError() { - const error = Boom.serverUnavailable('Automatic index creation failed'); - error.output.payload.attributes = error.output.payload.attributes || {}; - error.output.payload.attributes.code = 'ES_AUTO_CREATE_INDEX_ERROR'; - - return decorate(error, CODE_ES_AUTO_CREATE_INDEX_ERROR, 503); - } - - public static isEsAutoCreateIndexError(error: Error | DecoratedError) { - return isSavedObjectsClientError(error) && error[code] === CODE_ES_AUTO_CREATE_INDEX_ERROR; - } - public static decorateGeneralError(error: Error, reason?: string) { return decorate(error, CODE_GENERAL_ERROR, 500, reason); } diff --git a/src/core/server/saved_objects/service/lib/repository.ts b/src/core/server/saved_objects/service/lib/repository.ts index 5f17c11792763..bc8ad2cdb0058 100644 --- a/src/core/server/saved_objects/service/lib/repository.ts +++ b/src/core/server/saved_objects/service/lib/repository.ts @@ -239,40 +239,31 @@ export class SavedObjectsRepository { } } - try { - const migrated = this._migrator.migrateDocument({ - id, - type, - ...(savedObjectNamespace && { namespace: savedObjectNamespace }), - ...(savedObjectNamespaces && { namespaces: savedObjectNamespaces }), - attributes, - migrationVersion, - updated_at: time, - ...(Array.isArray(references) && { references }), - }); - - const raw = this._serializer.savedObjectToRaw(migrated as SavedObjectSanitizedDoc); + const migrated = this._migrator.migrateDocument({ + id, + type, + ...(savedObjectNamespace && { namespace: savedObjectNamespace }), + ...(savedObjectNamespaces && { namespaces: savedObjectNamespaces }), + attributes, + migrationVersion, + updated_at: time, + ...(Array.isArray(references) && { references }), + }); - const method = id && overwrite ? 'index' : 'create'; - const response = await this._writeToCluster(method, { - id: raw._id, - index: this.getIndexForType(type), - refresh, - body: raw._source, - }); + const raw = this._serializer.savedObjectToRaw(migrated as SavedObjectSanitizedDoc); - return this._rawToSavedObject({ - ...raw, - ...response, - }); - } catch (error) { - if (SavedObjectsErrorHelpers.isNotFoundError(error)) { - // See "503s from missing index" above - throw SavedObjectsErrorHelpers.createEsAutoCreateIndexError(); - } + const method = id && overwrite ? 'index' : 'create'; + const response = await this._writeToCluster(method, { + id: raw._id, + index: this.getIndexForType(type), + refresh, + body: raw._source, + }); - throw error; - } + return this._rawToSavedObject({ + ...raw, + ...response, + }); } /** diff --git a/src/core/server/saved_objects/types.ts b/src/core/server/saved_objects/types.ts index b50c6dc9a1abf..43b7663491711 100644 --- a/src/core/server/saved_objects/types.ts +++ b/src/core/server/saved_objects/types.ts @@ -156,15 +156,6 @@ export type MutatingOperationRefreshSetting = boolean | 'wait_for'; * takes special care to ensure that 404 errors are generic and don't distinguish * between index missing or document missing. * - * ### 503s from missing index - * - * Unlike all other methods, create requests are supposed to succeed even when - * the Kibana index does not exist because it will be automatically created by - * elasticsearch. When that is not the case it is because Elasticsearch's - * `action.auto_create_index` setting prevents it from being created automatically - * so we throw a special 503 with the intention of informing the user that their - * Elasticsearch settings need to be updated. - * * See {@link SavedObjectsClient} * See {@link SavedObjectsErrorHelpers} * diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md index 6369720ada2c3..2efa7dac393b4 100644 --- a/src/core/server/server.api.md +++ b/src/core/server/server.api.md @@ -1875,8 +1875,6 @@ export class SavedObjectsErrorHelpers { // (undocumented) static createConflictError(type: string, id: string): DecoratedError; // (undocumented) - static createEsAutoCreateIndexError(): DecoratedError; - // (undocumented) static createGenericNotFoundError(type?: string | null, id?: string | null): DecoratedError; // (undocumented) static createInvalidVersionError(versionInput?: string): DecoratedError; @@ -1903,8 +1901,6 @@ export class SavedObjectsErrorHelpers { // (undocumented) static isConflictError(error: Error | DecoratedError): boolean; // (undocumented) - static isEsAutoCreateIndexError(error: Error | DecoratedError): boolean; - // (undocumented) static isEsCannotExecuteScriptError(error: Error | DecoratedError): boolean; // (undocumented) static isEsUnavailableError(error: Error | DecoratedError): boolean; diff --git a/src/legacy/ui/public/_index.scss b/src/legacy/ui/public/_index.scss index b36e62297cc23..f10718ba58c2c 100644 --- a/src/legacy/ui/public/_index.scss +++ b/src/legacy/ui/public/_index.scss @@ -10,7 +10,6 @@ @import './accessibility/index'; @import './directives/index'; -@import './error_auto_create_index/index'; @import './error_url_overflow/index'; @import './exit_full_screen/index'; @import './field_editor/index'; diff --git a/src/legacy/ui/public/error_auto_create_index/_error_auto_create_index.scss b/src/legacy/ui/public/error_auto_create_index/_error_auto_create_index.scss deleted file mode 100644 index ad31aabfc66cd..0000000000000 --- a/src/legacy/ui/public/error_auto_create_index/_error_auto_create_index.scss +++ /dev/null @@ -1,3 +0,0 @@ -.kbnError--auto-create-index { - padding: $euiSizeL; -} diff --git a/src/legacy/ui/public/error_auto_create_index/_index.scss b/src/legacy/ui/public/error_auto_create_index/_index.scss deleted file mode 100644 index 42e672ab322dc..0000000000000 --- a/src/legacy/ui/public/error_auto_create_index/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import './error_auto_create_index' diff --git a/src/legacy/ui/public/error_auto_create_index/error_auto_create_index.html b/src/legacy/ui/public/error_auto_create_index/error_auto_create_index.html deleted file mode 100644 index 2af31dda6c345..0000000000000 --- a/src/legacy/ui/public/error_auto_create_index/error_auto_create_index.html +++ /dev/null @@ -1,69 +0,0 @@ -
-

- - -

- -

- -

- -

-
    -
  1. -
  2. -
  3. -
- -
-
- - -
- -
-
-
-
-
diff --git a/src/legacy/ui/public/error_auto_create_index/error_auto_create_index.test.js b/src/legacy/ui/public/error_auto_create_index/error_auto_create_index.test.js deleted file mode 100644 index a8f6318090b1d..0000000000000 --- a/src/legacy/ui/public/error_auto_create_index/error_auto_create_index.test.js +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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. - */ - -// @ts-ignore -import './error_auto_create_index.test.mocks'; -import fetchMock from 'fetch-mock/es5/client'; -import { kfetch } from '../kfetch'; - -import { isAutoCreateIndexError } from './error_auto_create_index'; - -describe('isAutoCreateIndexError correctly handles KFetchError thrown by kfetch', () => { - describe('404', () => { - beforeEach(() => { - fetchMock.post({ - matcher: '*', - response: { - status: 404, - }, - }); - }); - afterEach(() => fetchMock.restore()); - - test('should return false', async () => { - expect.assertions(1); - try { - await kfetch({ method: 'POST', pathname: '/my/path' }); - } catch (kfetchError) { - expect(isAutoCreateIndexError(kfetchError)).toBe(false); - } - }); - }); - - describe('503 error that is not ES_AUTO_CREATE_INDEX_ERROR', () => { - beforeEach(() => { - fetchMock.post({ - matcher: '*', - response: { - status: 503, - }, - }); - }); - afterEach(() => fetchMock.restore()); - - test('should return false', async () => { - expect.assertions(1); - try { - await kfetch({ method: 'POST', pathname: '/my/path' }); - } catch (kfetchError) { - expect(isAutoCreateIndexError(kfetchError)).toBe(false); - } - }); - }); - - describe('503 error that is ES_AUTO_CREATE_INDEX_ERROR', () => { - beforeEach(() => { - fetchMock.post({ - matcher: '*', - response: { - body: { - attributes: { - code: 'ES_AUTO_CREATE_INDEX_ERROR', - }, - }, - status: 503, - }, - }); - }); - afterEach(() => fetchMock.restore()); - - test('should return true', async () => { - expect.assertions(1); - try { - await kfetch({ method: 'POST', pathname: '/my/path' }); - } catch (kfetchError) { - expect(isAutoCreateIndexError(kfetchError)).toBe(true); - } - }); - }); -}); diff --git a/src/legacy/ui/public/error_auto_create_index/error_auto_create_index.test.mocks.js b/src/legacy/ui/public/error_auto_create_index/error_auto_create_index.test.mocks.js deleted file mode 100644 index 1ac30b85c5a85..0000000000000 --- a/src/legacy/ui/public/error_auto_create_index/error_auto_create_index.test.mocks.js +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 { setup } from '../../../../test_utils/public/http_test_setup'; - -jest.doMock('ui/new_platform', () => ({ npSetup: { core: setup() } })); diff --git a/src/legacy/ui/public/error_auto_create_index/error_auto_create_index.ts b/src/legacy/ui/public/error_auto_create_index/error_auto_create_index.ts deleted file mode 100644 index 09c6bfd93148f..0000000000000 --- a/src/legacy/ui/public/error_auto_create_index/error_auto_create_index.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 { i18n } from '@kbn/i18n'; -import { get } from 'lodash'; - -import uiRoutes from '../routes'; - -import template from './error_auto_create_index.html'; - -uiRoutes.when('/error/action.auto_create_index', { - template, - k7Breadcrumbs: () => [ - { - text: i18n.translate('common.ui.errorAutoCreateIndex.breadcrumbs.errorText', { - defaultMessage: 'Error', - }), - }, - ], -}); - -export function isAutoCreateIndexError(error: object) { - return ( - get(error, 'res.status') === 503 && - get(error, 'body.attributes.code') === 'ES_AUTO_CREATE_INDEX_ERROR' - ); -} - -export function showAutoCreateIndexErrorPage() { - window.location.hash = '/error/action.auto_create_index'; -} diff --git a/src/legacy/ui/public/error_auto_create_index/index.ts b/src/legacy/ui/public/error_auto_create_index/index.ts deleted file mode 100644 index d290e0334b3d6..0000000000000 --- a/src/legacy/ui/public/error_auto_create_index/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 { isAutoCreateIndexError, showAutoCreateIndexErrorPage } from './error_auto_create_index'; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 712ceffaef6ed..785a58baa24a8 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -138,17 +138,6 @@ "charts.controls.rangeErrorMessage": "値は {min} と {max} の間でなければなりません", "charts.controls.vislibBasicOptions.legendPositionLabel": "凡例位置", "charts.controls.vislibBasicOptions.showTooltipLabel": "ツールヒントを表示", - "common.ui.errorAutoCreateIndex.breadcrumbs.errorText": "エラー", - "common.ui.errorAutoCreateIndex.errorDescription": "Elasticsearch クラスターの {autoCreateIndexActionConfig} 設定が原因で、Kibana が保存されたオブジェクトを格納するインデックスを自動的に作成できないようです。Kibana は、保存されたオブジェクトインデックスが適切なマッピング/スキーマを使用し Kibana から Elasticsearch へのポーリングの回数を減らすための最適な手段であるため、この Elasticsearch の機能を使用します。", - "common.ui.errorAutoCreateIndex.errorDisclaimer": "申し訳ございませんが、この問題が解決されるまで Kibana で何も保存することができません。", - "common.ui.errorAutoCreateIndex.errorTitle": "おっと!", - "common.ui.errorAutoCreateIndex.howToFixError.goBackText": "ブラウザの戻るボタンで前の画面に戻ります。", - "common.ui.errorAutoCreateIndex.howToFixError.removeConfigText": "Elasticsearch 構成ファイルから {autoCreateIndexActionConfig} を削除します。", - "common.ui.errorAutoCreateIndex.howToFixError.restartText": "Elasticsearch を再起動します。", - "common.ui.errorAutoCreateIndex.howToFixErrorTitle": "どうすれば良いのでしょう?", - "common.ui.errorAutoCreateIndex.noteImageAriaLabel": "情報", - "common.ui.errorAutoCreateIndex.noteMessage": "{autoCreateIndexActionConfig} は、機能を有効にするパターンのホワイトリストを定義することもできます。Kibana と同じ理由でこの機能を使用する他のプラグイン/操作をすべて把握する必要があるため、この設定のこのような使い方はここでは説明しません。", - "common.ui.errorAutoCreateIndex.noteTitle": "注:", "common.ui.errorUrlOverflow.breadcrumbs.errorText": "エラー", "common.ui.errorUrlOverflow.errorDescription": "とても長い URL ですね。残念なお知らせがあります。ご使用のブラウザは Kibana の超巨大 URL に対応していません。問題を避けるため、Kibana はご使用のブラウザでの URL を {urlCharacterLimit} 文字に制限します。", "common.ui.errorUrlOverflow.errorTitle": "おっと!", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 7358b381ca7a2..ccee034773fef 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -138,17 +138,6 @@ "charts.controls.rangeErrorMessage": "值必须是在 {min} 到 {max} 的范围内", "charts.controls.vislibBasicOptions.legendPositionLabel": "图例位置", "charts.controls.vislibBasicOptions.showTooltipLabel": "显示工具提示", - "common.ui.errorAutoCreateIndex.breadcrumbs.errorText": "错误", - "common.ui.errorAutoCreateIndex.errorDescription": "似乎 Elasticsearch 集群的 {autoCreateIndexActionConfig} 设置使 Kibana 无法自动创建用于存储已保存对象的索引。Kibana 将使用此 Elasticsearch 功能,因为这是确保已保存对象索引使用正确映射/架构的最好方式,而且其允许 Kibana 较少地轮询 Elasticsearch。", - "common.ui.errorAutoCreateIndex.errorDisclaimer": "但是,只有解决了此问题后,您才能在 Kibana 保存内容。", - "common.ui.errorAutoCreateIndex.errorTitle": "糟糕!", - "common.ui.errorAutoCreateIndex.howToFixError.goBackText": "使用浏览器的后退按钮返回您之前正做的工作。", - "common.ui.errorAutoCreateIndex.howToFixError.removeConfigText": "从 Elasticsearch 配置文件中删除 {autoCreateIndexActionConfig}", - "common.ui.errorAutoCreateIndex.howToFixError.restartText": "重新启动 Elasticsearch。", - "common.ui.errorAutoCreateIndex.howToFixErrorTitle": "那么,我如何解决此问题?", - "common.ui.errorAutoCreateIndex.noteImageAriaLabel": "信息", - "common.ui.errorAutoCreateIndex.noteMessage": "{autoCreateIndexActionConfig} 还可以定义应启用此功能的模式白名单。我们在这里不讨论如何以那种方式使用该设置,因为这和 Kibana 一样需要您了解依赖该功能的所有其他插件/交互。", - "common.ui.errorAutoCreateIndex.noteTitle": "注意:", "common.ui.errorUrlOverflow.breadcrumbs.errorText": "错误", "common.ui.errorUrlOverflow.errorDescription": "您的 URL 真不小。我有一些不幸的消息:您的浏览器与 Kibana 的超长 URL 不太兼容。为了避免您遇到问题,Kibana 在您的浏览器中将 URL 长度限制在 {urlCharacterLimit} 个字符。", "common.ui.errorUrlOverflow.errorTitle": "喔哦!", From 2d525380fa205936f1815b518f4bb8a9d2e7d0b7 Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Mon, 27 Apr 2020 10:39:29 +0200 Subject: [PATCH 20/26] Migrate kql_telemetry saved object registration to Kibana platform (#64149) --- src/legacy/core_plugins/kibana/index.js | 6 ---- src/legacy/core_plugins/kibana/mappings.json | 10 ------ .../kql_telemetry/kql_telemetry_service.ts | 4 ++- .../data/server/saved_objects/index.ts | 1 + .../server/saved_objects/kql_telementry.ts | 35 +++++++++++++++++++ 5 files changed, 39 insertions(+), 17 deletions(-) create mode 100644 src/plugins/data/server/saved_objects/kql_telementry.ts diff --git a/src/legacy/core_plugins/kibana/index.js b/src/legacy/core_plugins/kibana/index.js index 8465d71e1e998..2d36d546e7163 100644 --- a/src/legacy/core_plugins/kibana/index.js +++ b/src/legacy/core_plugins/kibana/index.js @@ -128,12 +128,6 @@ export default function(kibana) { }, }, - savedObjectSchemas: { - 'kql-telemetry': { - isNamespaceAgnostic: true, - }, - }, - injectDefaultVars(server, options) { const mapConfig = server.config().get('map'); const tilemap = mapConfig.tilemap; diff --git a/src/legacy/core_plugins/kibana/mappings.json b/src/legacy/core_plugins/kibana/mappings.json index febdf2cc3d649..81b46878f6c1a 100644 --- a/src/legacy/core_plugins/kibana/mappings.json +++ b/src/legacy/core_plugins/kibana/mappings.json @@ -27,15 +27,5 @@ "type": "keyword" } } - }, - "kql-telemetry": { - "properties": { - "optInCount": { - "type": "long" - }, - "optOutCount": { - "type": "long" - } - } } } diff --git a/src/plugins/data/server/kql_telemetry/kql_telemetry_service.ts b/src/plugins/data/server/kql_telemetry/kql_telemetry_service.ts index e45ad796bd9d4..3dfaa9c6d0a98 100644 --- a/src/plugins/data/server/kql_telemetry/kql_telemetry_service.ts +++ b/src/plugins/data/server/kql_telemetry/kql_telemetry_service.ts @@ -22,14 +22,16 @@ import { CoreSetup, Plugin, PluginInitializerContext } from 'kibana/server'; import { registerKqlTelemetryRoute } from './route'; import { UsageCollectionSetup } from '../../../usage_collection/server'; import { makeKQLUsageCollector } from './usage_collector'; +import { kqlTelemetry } from '../saved_objects'; export class KqlTelemetryService implements Plugin { constructor(private initializerContext: PluginInitializerContext) {} public setup( - { http, getStartServices }: CoreSetup, + { http, getStartServices, savedObjects }: CoreSetup, { usageCollection }: { usageCollection?: UsageCollectionSetup } ) { + savedObjects.registerType(kqlTelemetry); registerKqlTelemetryRoute( http.createRouter(), getStartServices, diff --git a/src/plugins/data/server/saved_objects/index.ts b/src/plugins/data/server/saved_objects/index.ts index 5d980974474de..4326200141179 100644 --- a/src/plugins/data/server/saved_objects/index.ts +++ b/src/plugins/data/server/saved_objects/index.ts @@ -20,3 +20,4 @@ export { searchSavedObjectType } from './search'; export { querySavedObjectType } from './query'; export { indexPatternSavedObjectType } from './index_patterns'; +export { kqlTelemetry } from './kql_telementry'; diff --git a/src/plugins/data/server/saved_objects/kql_telementry.ts b/src/plugins/data/server/saved_objects/kql_telementry.ts new file mode 100644 index 0000000000000..6539d5eacfde2 --- /dev/null +++ b/src/plugins/data/server/saved_objects/kql_telementry.ts @@ -0,0 +1,35 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 { SavedObjectsType } from 'kibana/server'; + +export const kqlTelemetry: SavedObjectsType = { + name: 'kql-telemetry', + namespaceType: 'agnostic', + hidden: false, + mappings: { + properties: { + optInCount: { + type: 'long', + }, + optOutCount: { + type: 'long', + }, + }, + }, +}; From a6fff8b2988ae21e6cd0cdf0d6ae13a2e3a44a22 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Mon, 27 Apr 2020 12:25:03 +0200 Subject: [PATCH 21/26] Bump karma-mocha dev-dependency from 1.3.0 to 2.0.0 (#64407) --- package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index fd6e10fb69424..bf5f270cabe99 100644 --- a/package.json +++ b/package.json @@ -456,7 +456,7 @@ "karma-firefox-launcher": "1.1.0", "karma-ie-launcher": "1.0.0", "karma-junit-reporter": "1.2.0", - "karma-mocha": "1.3.0", + "karma-mocha": "2.0.0", "karma-safari-launcher": "1.0.0", "license-checker": "^16.0.0", "listr": "^0.14.1", diff --git a/yarn.lock b/yarn.lock index 866aa7255baaa..0a1432882c327 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18777,12 +18777,12 @@ karma-junit-reporter@1.2.0: path-is-absolute "^1.0.0" xmlbuilder "8.2.2" -karma-mocha@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-1.3.0.tgz#eeaac7ffc0e201eb63c467440d2b69c7cf3778bf" - integrity sha1-7qrH/8DiAetjxGdEDStpx883eL8= +karma-mocha@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/karma-mocha/-/karma-mocha-2.0.0.tgz#ad6b56b6a72e9b191e4c432dd30f4a44fc2435bc" + integrity sha512-qiZkZDJnn2kb9t2m4LoM4cYJHJVPoxvAYYe0B+go5s+A/3vc/3psUT05zW4yFz4vT0xHf+XzTTery8zdr8GWgA== dependencies: - minimist "1.2.0" + minimist "^1.2.3" karma-safari-launcher@1.0.0: version "1.0.0" @@ -20584,7 +20584,7 @@ minimist@1.2.2: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.2.tgz#b00a00230a1108c48c169e69a291aafda3aacd63" integrity sha512-rIqbOrKb8GJmx/5bc2M0QchhUouMXSpd1RTclXsB41JdL+VtnojfaJR+h7F9k18/4kHUsBFgk80Uk+q569vjPA== -minimist@^1.2.5: +minimist@^1.2.3, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== From 5f13ad107fda589e6c2045e235e12d0a1d590d70 Mon Sep 17 00:00:00 2001 From: Maryia Lapata Date: Mon, 27 Apr 2020 14:19:46 +0300 Subject: [PATCH 22/26] [NP] Migrate ui capabilities (#64185) * Migrate ui capabilities * Add capabilities for dashboard --- src/legacy/core_plugins/kibana/index.js | 55 ------------------- src/plugins/advanced_settings/kibana.json | 2 +- .../server/capabilities_provider.ts | 25 +++++++++ src/plugins/advanced_settings/server/index.ts | 24 ++++++++ .../advanced_settings/server/plugin.ts | 44 +++++++++++++++ .../dashboard/server/capabilities_provider.ts | 27 +++++++++ src/plugins/dashboard/server/plugin.ts | 2 + .../index_patterns/capabilities_provider.ts | 24 ++++++++ .../index_patterns/index_patterns_service.ts | 2 + src/plugins/discover/kibana.json | 2 +- .../discover/server/capabilities_provider.ts | 27 +++++++++ src/plugins/discover/server/index.ts | 24 ++++++++ src/plugins/discover/server/plugin.ts | 44 +++++++++++++++ .../home/server/capabilities_provider.ts | 29 ++++++++++ src/plugins/home/server/plugin.ts | 2 + src/plugins/management/kibana.json | 2 +- .../server/capabilities_provider.ts | 32 +++++++++++ src/plugins/management/server/index.ts | 24 ++++++++ src/plugins/management/server/plugin.ts | 44 +++++++++++++++ .../server/capabilities_provider.ts | 26 +++++++++ .../saved_objects_management/server/plugin.ts | 5 +- src/plugins/visualize/kibana.json | 2 +- .../visualize/server/capabilities_provider.ts | 28 ++++++++++ src/plugins/visualize/server/index.ts | 24 ++++++++ src/plugins/visualize/server/plugin.ts | 44 +++++++++++++++ 25 files changed, 504 insertions(+), 60 deletions(-) create mode 100644 src/plugins/advanced_settings/server/capabilities_provider.ts create mode 100644 src/plugins/advanced_settings/server/index.ts create mode 100644 src/plugins/advanced_settings/server/plugin.ts create mode 100644 src/plugins/dashboard/server/capabilities_provider.ts create mode 100644 src/plugins/data/server/index_patterns/capabilities_provider.ts create mode 100644 src/plugins/discover/server/capabilities_provider.ts create mode 100644 src/plugins/discover/server/index.ts create mode 100644 src/plugins/discover/server/plugin.ts create mode 100644 src/plugins/home/server/capabilities_provider.ts create mode 100644 src/plugins/management/server/capabilities_provider.ts create mode 100644 src/plugins/management/server/index.ts create mode 100644 src/plugins/management/server/plugin.ts create mode 100644 src/plugins/saved_objects_management/server/capabilities_provider.ts create mode 100644 src/plugins/visualize/server/capabilities_provider.ts create mode 100644 src/plugins/visualize/server/index.ts create mode 100644 src/plugins/visualize/server/plugin.ts diff --git a/src/legacy/core_plugins/kibana/index.js b/src/legacy/core_plugins/kibana/index.js index 2d36d546e7163..19ae3f7a177ef 100644 --- a/src/legacy/core_plugins/kibana/index.js +++ b/src/legacy/core_plugins/kibana/index.js @@ -152,61 +152,6 @@ export default function(kibana) { uiSettingDefaults: getUiSettingDefaults(), }, - uiCapabilities: async function() { - return { - discover: { - show: true, - createShortUrl: true, - save: true, - saveQuery: true, - }, - visualize: { - show: true, - createShortUrl: true, - delete: true, - save: true, - saveQuery: true, - }, - dashboard: { - createNew: true, - show: true, - showWriteControls: true, - saveQuery: true, - }, - catalogue: { - discover: true, - dashboard: true, - visualize: true, - console: true, - advanced_settings: true, - index_patterns: true, - }, - advancedSettings: { - show: true, - save: true, - }, - indexPatterns: { - save: true, - }, - savedObjectsManagement: { - delete: true, - edit: true, - read: true, - }, - management: { - /* - * Management settings correspond to management section/link ids, and should not be changed - * without also updating those definitions. - */ - kibana: { - settings: true, - index_patterns: true, - objects: true, - }, - }, - }; - }, - preInit: async function(server) { try { // Create the data directory (recursively, if the a parent dir doesn't exist). diff --git a/src/plugins/advanced_settings/kibana.json b/src/plugins/advanced_settings/kibana.json index cac9a6daa8df8..e6ca6e797ba45 100644 --- a/src/plugins/advanced_settings/kibana.json +++ b/src/plugins/advanced_settings/kibana.json @@ -1,7 +1,7 @@ { "id": "advancedSettings", "version": "kibana", - "server": false, + "server": true, "ui": true, "requiredPlugins": ["management"] } diff --git a/src/plugins/advanced_settings/server/capabilities_provider.ts b/src/plugins/advanced_settings/server/capabilities_provider.ts new file mode 100644 index 0000000000000..083d5f3ffced4 --- /dev/null +++ b/src/plugins/advanced_settings/server/capabilities_provider.ts @@ -0,0 +1,25 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 const capabilitiesProvider = () => ({ + advancedSettings: { + show: true, + save: true, + }, +}); diff --git a/src/plugins/advanced_settings/server/index.ts b/src/plugins/advanced_settings/server/index.ts new file mode 100644 index 0000000000000..ffcf7cd49a8c3 --- /dev/null +++ b/src/plugins/advanced_settings/server/index.ts @@ -0,0 +1,24 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 { PluginInitializerContext } from 'kibana/server'; +import { AdvancedSettingsServerPlugin } from './plugin'; + +export const plugin = (initContext: PluginInitializerContext) => + new AdvancedSettingsServerPlugin(initContext); diff --git a/src/plugins/advanced_settings/server/plugin.ts b/src/plugins/advanced_settings/server/plugin.ts new file mode 100644 index 0000000000000..4d7bd34259819 --- /dev/null +++ b/src/plugins/advanced_settings/server/plugin.ts @@ -0,0 +1,44 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 { PluginInitializerContext, CoreSetup, CoreStart, Plugin, Logger } from 'kibana/server'; +import { capabilitiesProvider } from './capabilities_provider'; + +export class AdvancedSettingsServerPlugin implements Plugin { + private readonly logger: Logger; + + constructor(initializerContext: PluginInitializerContext) { + this.logger = initializerContext.logger.get(); + } + + public setup(core: CoreSetup) { + this.logger.debug('advancedSettings: Setup'); + + core.capabilities.registerProvider(capabilitiesProvider); + + return {}; + } + + public start(core: CoreStart) { + this.logger.debug('advancedSettings: Started'); + return {}; + } + + public stop() {} +} diff --git a/src/plugins/dashboard/server/capabilities_provider.ts b/src/plugins/dashboard/server/capabilities_provider.ts new file mode 100644 index 0000000000000..0bb53d60c38a5 --- /dev/null +++ b/src/plugins/dashboard/server/capabilities_provider.ts @@ -0,0 +1,27 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 const capabilitiesProvider = () => ({ + dashboard: { + createNew: true, + show: true, + showWriteControls: true, + saveQuery: true, + }, +}); diff --git a/src/plugins/dashboard/server/plugin.ts b/src/plugins/dashboard/server/plugin.ts index 5d1b66002e749..ba7bdeeda0133 100644 --- a/src/plugins/dashboard/server/plugin.ts +++ b/src/plugins/dashboard/server/plugin.ts @@ -26,6 +26,7 @@ import { } from '../../../core/server'; import { dashboardSavedObjectType } from './saved_objects'; +import { capabilitiesProvider } from './capabilities_provider'; import { DashboardPluginSetup, DashboardPluginStart } from './types'; @@ -40,6 +41,7 @@ export class DashboardPlugin implements Plugin ({ + indexPatterns: { + save: true, + }, +}); diff --git a/src/plugins/data/server/index_patterns/index_patterns_service.ts b/src/plugins/data/server/index_patterns/index_patterns_service.ts index 58e8fbae9f9e2..3e31f8e8a566d 100644 --- a/src/plugins/data/server/index_patterns/index_patterns_service.ts +++ b/src/plugins/data/server/index_patterns/index_patterns_service.ts @@ -20,10 +20,12 @@ import { CoreSetup, Plugin } from 'kibana/server'; import { registerRoutes } from './routes'; import { indexPatternSavedObjectType } from '../saved_objects'; +import { capabilitiesProvider } from './capabilities_provider'; export class IndexPatternsService implements Plugin { public setup(core: CoreSetup) { core.savedObjects.registerType(indexPatternSavedObjectType); + core.capabilities.registerProvider(capabilitiesProvider); registerRoutes(core.http); } diff --git a/src/plugins/discover/kibana.json b/src/plugins/discover/kibana.json index 91d6358d44c18..2d41293f26369 100644 --- a/src/plugins/discover/kibana.json +++ b/src/plugins/discover/kibana.json @@ -1,6 +1,6 @@ { "id": "discover", "version": "kibana", - "server": false, + "server": true, "ui": true } diff --git a/src/plugins/discover/server/capabilities_provider.ts b/src/plugins/discover/server/capabilities_provider.ts new file mode 100644 index 0000000000000..2e03631894aee --- /dev/null +++ b/src/plugins/discover/server/capabilities_provider.ts @@ -0,0 +1,27 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 const capabilitiesProvider = () => ({ + discover: { + show: true, + createShortUrl: true, + save: true, + saveQuery: true, + }, +}); diff --git a/src/plugins/discover/server/index.ts b/src/plugins/discover/server/index.ts new file mode 100644 index 0000000000000..15a948c56148e --- /dev/null +++ b/src/plugins/discover/server/index.ts @@ -0,0 +1,24 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 { PluginInitializerContext } from 'kibana/server'; +import { DiscoverServerPlugin } from './plugin'; + +export const plugin = (initContext: PluginInitializerContext) => + new DiscoverServerPlugin(initContext); diff --git a/src/plugins/discover/server/plugin.ts b/src/plugins/discover/server/plugin.ts new file mode 100644 index 0000000000000..04502f5fc14e6 --- /dev/null +++ b/src/plugins/discover/server/plugin.ts @@ -0,0 +1,44 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 { PluginInitializerContext, CoreSetup, CoreStart, Plugin, Logger } from 'kibana/server'; +import { capabilitiesProvider } from './capabilities_provider'; + +export class DiscoverServerPlugin implements Plugin { + private readonly logger: Logger; + + constructor(initializerContext: PluginInitializerContext) { + this.logger = initializerContext.logger.get(); + } + + public setup(core: CoreSetup) { + this.logger.debug('discover: Setup'); + + core.capabilities.registerProvider(capabilitiesProvider); + + return {}; + } + + public start(core: CoreStart) { + this.logger.debug('discover: Started'); + return {}; + } + + public stop() {} +} diff --git a/src/plugins/home/server/capabilities_provider.ts b/src/plugins/home/server/capabilities_provider.ts new file mode 100644 index 0000000000000..1c662e2301e16 --- /dev/null +++ b/src/plugins/home/server/capabilities_provider.ts @@ -0,0 +1,29 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 const capabilitiesProvider = () => ({ + catalogue: { + discover: true, + dashboard: true, + visualize: true, + console: true, + advanced_settings: true, + index_patterns: true, + }, +}); diff --git a/src/plugins/home/server/plugin.ts b/src/plugins/home/server/plugin.ts index 1f530bc58f0b9..1050c19362ae1 100644 --- a/src/plugins/home/server/plugin.ts +++ b/src/plugins/home/server/plugin.ts @@ -26,6 +26,7 @@ import { SampleDataRegistryStart, } from './services'; import { UsageCollectionSetup } from '../../usage_collection/server'; +import { capabilitiesProvider } from './capabilities_provider'; import { sampleDataTelemetry } from './saved_objects'; interface HomeServerPluginSetupDependencies { @@ -38,6 +39,7 @@ export class HomeServerPlugin implements Plugin ({ + management: { + /* + * Management settings correspond to management section/link ids, and should not be changed + * without also updating those definitions. + */ + kibana: { + settings: true, + index_patterns: true, + objects: true, + }, + }, +}); diff --git a/src/plugins/management/server/index.ts b/src/plugins/management/server/index.ts new file mode 100644 index 0000000000000..afc7adf8832e1 --- /dev/null +++ b/src/plugins/management/server/index.ts @@ -0,0 +1,24 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 { PluginInitializerContext } from 'kibana/server'; +import { ManagementServerPlugin } from './plugin'; + +export const plugin = (initContext: PluginInitializerContext) => + new ManagementServerPlugin(initContext); diff --git a/src/plugins/management/server/plugin.ts b/src/plugins/management/server/plugin.ts new file mode 100644 index 0000000000000..f8fda7da9b95a --- /dev/null +++ b/src/plugins/management/server/plugin.ts @@ -0,0 +1,44 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 { PluginInitializerContext, CoreSetup, CoreStart, Plugin, Logger } from 'kibana/server'; +import { capabilitiesProvider } from './capabilities_provider'; + +export class ManagementServerPlugin implements Plugin { + private readonly logger: Logger; + + constructor(initializerContext: PluginInitializerContext) { + this.logger = initializerContext.logger.get(); + } + + public setup(core: CoreSetup) { + this.logger.debug('management: Setup'); + + core.capabilities.registerProvider(capabilitiesProvider); + + return {}; + } + + public start(core: CoreStart) { + this.logger.debug('management: Started'); + return {}; + } + + public stop() {} +} diff --git a/src/plugins/saved_objects_management/server/capabilities_provider.ts b/src/plugins/saved_objects_management/server/capabilities_provider.ts new file mode 100644 index 0000000000000..bd621de4a6195 --- /dev/null +++ b/src/plugins/saved_objects_management/server/capabilities_provider.ts @@ -0,0 +1,26 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 const capabilitiesProvider = () => ({ + savedObjectsManagement: { + delete: true, + edit: true, + read: true, + }, +}); diff --git a/src/plugins/saved_objects_management/server/plugin.ts b/src/plugins/saved_objects_management/server/plugin.ts index b72644b500967..4e39b08f5c62c 100644 --- a/src/plugins/saved_objects_management/server/plugin.ts +++ b/src/plugins/saved_objects_management/server/plugin.ts @@ -23,6 +23,7 @@ import { CoreSetup, CoreStart, Logger, Plugin, PluginInitializerContext } from ' import { SavedObjectsManagementPluginSetup, SavedObjectsManagementPluginStart } from './types'; import { SavedObjectsManagement } from './services'; import { registerRoutes } from './routes'; +import { capabilitiesProvider } from './capabilities_provider'; export class SavedObjectsManagementPlugin implements Plugin { @@ -33,13 +34,15 @@ export class SavedObjectsManagementPlugin this.logger = this.context.logger.get(); } - public async setup({ http }: CoreSetup) { + public async setup({ http, capabilities }: CoreSetup) { this.logger.debug('Setting up SavedObjectsManagement plugin'); registerRoutes({ http, managementServicePromise: this.managementService$.pipe(first()).toPromise(), }); + capabilities.registerProvider(capabilitiesProvider); + return {}; } diff --git a/src/plugins/visualize/kibana.json b/src/plugins/visualize/kibana.json index a7afa0697a5eb..d536d2f246a6b 100644 --- a/src/plugins/visualize/kibana.json +++ b/src/plugins/visualize/kibana.json @@ -1,7 +1,7 @@ { "id": "visualize", "version": "kibana", - "server": false, + "server": true, "ui": true, "requiredPlugins": [ "data", diff --git a/src/plugins/visualize/server/capabilities_provider.ts b/src/plugins/visualize/server/capabilities_provider.ts new file mode 100644 index 0000000000000..3b09b28f53c77 --- /dev/null +++ b/src/plugins/visualize/server/capabilities_provider.ts @@ -0,0 +1,28 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 const capabilitiesProvider = () => ({ + visualize: { + show: true, + createShortUrl: true, + delete: true, + save: true, + saveQuery: true, + }, +}); diff --git a/src/plugins/visualize/server/index.ts b/src/plugins/visualize/server/index.ts new file mode 100644 index 0000000000000..5cebef71d8d22 --- /dev/null +++ b/src/plugins/visualize/server/index.ts @@ -0,0 +1,24 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 { PluginInitializerContext } from 'kibana/server'; +import { VisualizeServerPlugin } from './plugin'; + +export const plugin = (initContext: PluginInitializerContext) => + new VisualizeServerPlugin(initContext); diff --git a/src/plugins/visualize/server/plugin.ts b/src/plugins/visualize/server/plugin.ts new file mode 100644 index 0000000000000..7cc57c25f3229 --- /dev/null +++ b/src/plugins/visualize/server/plugin.ts @@ -0,0 +1,44 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 { PluginInitializerContext, CoreSetup, CoreStart, Plugin, Logger } from 'kibana/server'; +import { capabilitiesProvider } from './capabilities_provider'; + +export class VisualizeServerPlugin implements Plugin { + private readonly logger: Logger; + + constructor(initializerContext: PluginInitializerContext) { + this.logger = initializerContext.logger.get(); + } + + public setup(core: CoreSetup) { + this.logger.debug('visualize: Setup'); + + core.capabilities.registerProvider(capabilitiesProvider); + + return {}; + } + + public start(core: CoreStart) { + this.logger.debug('visualize: Started'); + return {}; + } + + public stop() {} +} From 0b8cd6eb46d8fbc63be4d5fe29cd59c4b7b9ce7c Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Mon, 27 Apr 2020 13:38:03 +0200 Subject: [PATCH 23/26] Migrate saved object of type url to kibana platform (#64043) --- src/legacy/core_plugins/kibana/index.js | 10 ---- src/legacy/core_plugins/kibana/mappings.json | 22 -------- src/plugins/share/server/plugin.ts | 2 + .../share/server/saved_objects/index.ts | 19 +++++++ src/plugins/share/server/saved_objects/url.ts | 54 +++++++++++++++++++ 5 files changed, 75 insertions(+), 32 deletions(-) create mode 100644 src/plugins/share/server/saved_objects/index.ts create mode 100644 src/plugins/share/server/saved_objects/url.ts diff --git a/src/legacy/core_plugins/kibana/index.js b/src/legacy/core_plugins/kibana/index.js index 19ae3f7a177ef..48d86e3628e49 100644 --- a/src/legacy/core_plugins/kibana/index.js +++ b/src/legacy/core_plugins/kibana/index.js @@ -118,16 +118,6 @@ export default function(kibana) { }, ], - savedObjectsManagement: { - url: { - defaultSearchField: 'url', - isImportableAndExportable: true, - getTitle(obj) { - return `/goto/${encodeURIComponent(obj.id)}`; - }, - }, - }, - injectDefaultVars(server, options) { const mapConfig = server.config().get('map'); const tilemap = mapConfig.tilemap; diff --git a/src/legacy/core_plugins/kibana/mappings.json b/src/legacy/core_plugins/kibana/mappings.json index 81b46878f6c1a..e2cbd584dbe1f 100644 --- a/src/legacy/core_plugins/kibana/mappings.json +++ b/src/legacy/core_plugins/kibana/mappings.json @@ -1,26 +1,4 @@ { - "url": { - "properties": { - "accessCount": { - "type": "long" - }, - "accessDate": { - "type": "date" - }, - "createDate": { - "type": "date" - }, - "url": { - "type": "text", - "fields": { - "keyword": { - "type": "keyword", - "ignore_above": 2048 - } - } - } - } - }, "server": { "properties": { "uuid": { diff --git a/src/plugins/share/server/plugin.ts b/src/plugins/share/server/plugin.ts index bcb681a50652a..0d9f183d13404 100644 --- a/src/plugins/share/server/plugin.ts +++ b/src/plugins/share/server/plugin.ts @@ -19,12 +19,14 @@ import { CoreSetup, Plugin, PluginInitializerContext } from 'kibana/server'; import { createRoutes } from './routes/create_routes'; +import { url } from './saved_objects'; export class SharePlugin implements Plugin { constructor(private readonly initializerContext: PluginInitializerContext) {} public async setup(core: CoreSetup) { createRoutes(core, this.initializerContext.logger.get()); + core.savedObjects.registerType(url); } public start() { diff --git a/src/plugins/share/server/saved_objects/index.ts b/src/plugins/share/server/saved_objects/index.ts new file mode 100644 index 0000000000000..956f031d2f1a5 --- /dev/null +++ b/src/plugins/share/server/saved_objects/index.ts @@ -0,0 +1,19 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 { url } from './url'; diff --git a/src/plugins/share/server/saved_objects/url.ts b/src/plugins/share/server/saved_objects/url.ts new file mode 100644 index 0000000000000..c76c21993a13f --- /dev/null +++ b/src/plugins/share/server/saved_objects/url.ts @@ -0,0 +1,54 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 { SavedObjectsType } from 'kibana/server'; + +export const url: SavedObjectsType = { + name: 'url', + namespaceType: 'single', + hidden: false, + management: { + icon: 'link', + defaultSearchField: 'url', + importableAndExportable: true, + getTitle(obj) { + return `/goto/${encodeURIComponent(obj.id)}`; + }, + }, + mappings: { + properties: { + accessCount: { + type: 'long', + }, + accessDate: { + type: 'date', + }, + createDate: { + type: 'date', + }, + url: { + type: 'text', + fields: { + keyword: { + type: 'keyword', + }, + }, + }, + }, + }, +}; From 8c05a724e7dae3e2c8494b9e53f2345bad2fa12b Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Mon, 27 Apr 2020 14:23:33 +0200 Subject: [PATCH 24/26] Bump cypress dev-dependency from 4.2.0 to 4.4.1 (#64408) --- package.json | 1 + src/es_archiver/actions/rebuild_all.ts | 4 +- x-pack/package.json | 2 +- yarn.lock | 178 +++++++++++++++---------- 4 files changed, 114 insertions(+), 71 deletions(-) diff --git a/package.json b/package.json index bf5f270cabe99..bfea8c7423f9c 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,7 @@ "**/@types/hapi": "^17.0.18", "**/@types/angular": "^1.6.56", "**/@types/hoist-non-react-statics": "^3.3.1", + "**/@types/chai": "^4.2.11", "**/typescript": "3.7.2", "**/graphql-toolkit/lodash": "^4.17.13", "**/hoist-non-react-statics": "^3.3.2", diff --git a/src/es_archiver/actions/rebuild_all.ts b/src/es_archiver/actions/rebuild_all.ts index 1467a1d0430b7..f35b2ca49c666 100644 --- a/src/es_archiver/actions/rebuild_all.ts +++ b/src/es_archiver/actions/rebuild_all.ts @@ -18,7 +18,7 @@ */ import { resolve, dirname, relative } from 'path'; -import { stat, rename, createReadStream, createWriteStream } from 'fs'; +import { stat, Stats, rename, createReadStream, createWriteStream } from 'fs'; import { Readable, Writable } from 'stream'; import { fromNode } from 'bluebird'; import { ToolingLog } from '@kbn/dev-utils'; @@ -33,7 +33,7 @@ import { } from '../lib'; async function isDirectory(path: string): Promise { - const stats = await fromNode(cb => stat(path, cb)); + const stats: Stats = await fromNode(cb => stat(path, cb)); return stats.isDirectory(); } diff --git a/x-pack/package.json b/x-pack/package.json index d0025ff436649..ca73884b8c7c7 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -121,7 +121,7 @@ "cheerio": "0.22.0", "commander": "3.0.2", "copy-webpack-plugin": "^5.0.4", - "cypress": "^4.2.0", + "cypress": "^4.4.1", "cypress-multi-reporters": "^1.2.3", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.2", diff --git a/yarn.lock b/yarn.lock index 0a1432882c327..f348aa99e6f20 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1192,6 +1192,32 @@ date-fns "^1.27.2" figures "^1.7.0" +"@cypress/request@2.88.5": + version "2.88.5" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.5.tgz#8d7ecd17b53a849cfd5ab06d5abe7d84976375d7" + integrity sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + "@cypress/webpack-preprocessor@^4.1.0": version "4.1.0" resolved "https://registry.yarnpkg.com/@cypress/webpack-preprocessor/-/webpack-preprocessor-4.1.0.tgz#8c4debc0b1abf045b62524d1996dd9aeaf7e86a8" @@ -3699,15 +3725,20 @@ resolved "https://registry.yarnpkg.com/@types/base64-js/-/base64-js-1.2.5.tgz#582b2476169a6cba460a214d476c744441d873d5" integrity sha1-WCskdhaabLpGCiFNR2x0REHYc9U= -"@types/bluebird@*": - version "3.5.28" - resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.28.tgz#04c1a520ff076649236bc8ca21198542ce2bdb09" - integrity sha512-0Vk/kqkukxPKSzP9c8WJgisgGDx5oZDbsLLWIP5t70yThO/YleE+GEm2S1GlRALTaack3O7U5OS5qEm7q2kciA== +"@types/blob-util@1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/blob-util/-/blob-util-1.3.3.tgz#adba644ae34f88e1dd9a5864c66ad651caaf628a" + integrity sha512-4ahcL/QDnpjWA2Qs16ZMQif7HjGP2cw3AGjHabybjw7Vm1EKu+cfQN1D78BaZbS1WJNa1opSMF5HNMztx7lR0w== + +"@types/bluebird@*", "@types/bluebird@^3.1.1": + version "3.5.30" + resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.30.tgz#ee034a0eeea8b84ed868b1aa60d690b08a6cfbc5" + integrity sha512-8LhzvcjIoqoi1TghEkRMkbbmM+jhHnBokPGkJWjclMK+Ks0MxEBow3/p2/iFTZ+OIbJHQDSfpgdZEb+af3gfVw== -"@types/bluebird@^3.1.1": - version "3.5.20" - resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.20.tgz#f6363172add6f4eabb8cada53ca9af2781e8d6a1" - integrity sha512-Wk41MVdF+cHBfVXj/ufUHJeO3BlIQr1McbHZANErMykaCWeDSZbH5erGjNBw2/3UlRdSxZbLfSuQTzFmPOYFsA== +"@types/bluebird@3.5.29": + version "3.5.29" + resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.29.tgz#7cd933c902c4fc83046517a1bef973886d00bdb6" + integrity sha512-kmVtnxTuUuhCET669irqQmPAez4KFnFVKvpleVRyfC3g+SHD1hIkFZcWLim9BVcwUBLO59o8VZE4yGCmTif8Yw== "@types/boom@*", "@types/boom@^7.2.0": version "7.2.0" @@ -3739,6 +3770,19 @@ resolved "https://registry.yarnpkg.com/@types/catbox/-/catbox-10.0.1.tgz#266679017749041fe9873fee1131dd2aaa04a07e" integrity sha512-ECuJ+f5gGHiLeiE4RlE/xdqv/0JVDToegPV1aTb10tQStYa0Ycq2OJfQukDv3IFaw3B+CMV46jHc5bXe6QXEQg== +"@types/chai-jquery@1.1.40": + version "1.1.40" + resolved "https://registry.yarnpkg.com/@types/chai-jquery/-/chai-jquery-1.1.40.tgz#445bedcbbb2ae4e3027f46fa2c1733c43481ffa1" + integrity sha512-mCNEZ3GKP7T7kftKeIs7QmfZZQM7hslGSpYzKbOlR2a2HCFf9ph4nlMRA9UnuOETeOQYJVhJQK7MwGqNZVyUtQ== + dependencies: + "@types/chai" "*" + "@types/jquery" "*" + +"@types/chai@*", "@types/chai@4.2.7", "@types/chai@^4.2.11": + version "4.2.11" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.11.tgz#d3614d6c5f500142358e6ed24e1bf16657536c50" + integrity sha512-t7uW6eFafjO+qJ3BIV2gGUyZs27egcNRkUdalkud+Qa3+kg//f129iuOFivHDXQ+vnU3fDXuwgv0cqMCbcE8sw== + "@types/chance@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/chance/-/chance-1.0.1.tgz#c10703020369602c40dd9428cc6e1437027116df" @@ -4176,7 +4220,7 @@ resolved "https://registry.yarnpkg.com/@types/joi/-/joi-13.6.1.tgz#325486a397504f8e22c8c551dc8b0e1d41d5d5ae" integrity sha512-JxZ0NP8NuB0BJOXi1KvAA6rySLTPmhOy4n2gzSFq/IFM3LNFm0h+2Vn/bPPgEYlWqzS2NPeLgKqfm75baX+Hog== -"@types/jquery@*", "@types/jquery@^3.3.31": +"@types/jquery@*", "@types/jquery@3.3.31", "@types/jquery@^3.3.31": version "3.3.31" resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.31.tgz#27c706e4bf488474e1cb54a71d8303f37c93451b" integrity sha512-Lz4BAJihoFw5nRzKvg4nawXPzutkv7wmfQ5121avptaSIXlDNJCUuxZxX/G+9EVidZGuO0UBlk+YjKbwRKJigg== @@ -4282,9 +4326,14 @@ "@types/lodash" "*" "@types/lodash@*", "@types/lodash@^4.14.110", "@types/lodash@^4.14.116": - version "4.14.137" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.137.tgz#8a4804937dc6462274ffcc088df8f14fc1b368e2" - integrity sha512-g4rNK5SRKloO+sUGbuO7aPtwbwzMgjK+bm9BBhLD7jGUiGR7zhwYEhSln/ihgYQBeIJ5j7xjyaYzrWTcu3UotQ== + version "4.14.150" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.150.tgz#649fe44684c3f1fcb6164d943c5a61977e8cf0bd" + integrity sha512-kMNLM5JBcasgYscD9x/Gvr6lTAv2NVgsKtet/hm93qMyf/D1pt+7jeEZklKJKxMVmXjxbRVQQGfqDSfipYCO6w== + +"@types/lodash@4.14.149": + version "4.14.149" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.149.tgz#1342d63d948c6062838fbf961012f74d4e638440" + integrity sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ== "@types/lodash@^3.10.1": version "3.10.2" @@ -4342,7 +4391,7 @@ dependencies: "@types/mime-db" "*" -"@types/minimatch@*", "@types/minimatch@^3.0.3": +"@types/minimatch@*", "@types/minimatch@3.0.3", "@types/minimatch@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== @@ -4359,6 +4408,11 @@ dependencies: "@types/node" "*" +"@types/mocha@5.2.7": + version "5.2.7" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" + integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== + "@types/mocha@^7.0.2": version "7.0.2" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-7.0.2.tgz#b17f16cf933597e10d6d78eae3251e692ce8b0ce" @@ -4751,11 +4805,36 @@ dependencies: "@types/node" "*" +"@types/sinon-chai@3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-3.2.3.tgz#afe392303dda95cc8069685d1e537ff434fa506e" + integrity sha512-TOUFS6vqS0PVL1I8NGVSNcFaNJtFoyZPXZ5zur+qlhDfOmQECZZM4H4kKgca6O8L+QceX/ymODZASfUfn+y4yQ== + dependencies: + "@types/chai" "*" + "@types/sinon" "*" + +"@types/sinon@*": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-9.0.0.tgz#5b70a360f55645dd64f205defd2a31b749a59799" + integrity sha512-v2TkYHkts4VXshMkcmot/H+ERZ2SevKa10saGaJPGCJ8vh3lKrC4u663zYEeRZxep+VbG6YRDtQ6gVqw9dYzPA== + dependencies: + "@types/sinonjs__fake-timers" "*" + +"@types/sinon@7.5.1": + version "7.5.1" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.5.1.tgz#d27b81af0d1cfe1f9b24eebe7a24f74ae40f5b7c" + integrity sha512-EZQUP3hSZQyTQRfiLqelC9NMWd1kqLcmQE0dMiklxBkgi84T+cHOhnKpgk4NnOWpGX863yE6+IaGnOXUNFqDnQ== + "@types/sinon@^7.0.13": version "7.0.13" resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-7.0.13.tgz#ca039c23a9e27ebea53e0901ef928ea2a1a6d313" integrity sha512-d7c/C/+H/knZ3L8/cxhicHUiTDxdgap0b/aNJfsmLwFu/iOP17mdgbQsbHA3SJmrzsjD0l3UEE5SN4xxuz5ung== +"@types/sinonjs__fake-timers@*": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz#681df970358c82836b42f989188d133e218c458e" + integrity sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA== + "@types/sizzle@*", "@types/sizzle@2.3.2": version "2.3.2" resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" @@ -10370,13 +10449,24 @@ cypress-multi-reporters@^1.2.3: debug "^4.1.1" lodash "^4.17.11" -cypress@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-4.2.0.tgz#45673fb648b1a77b9a78d73e58b89ed05212d243" - integrity sha512-8LdreL91S/QiTCLYLNbIjLL8Ht4fJmu/4HGLxUI20Tc7JSfqEfCmXELrRfuPT0kjosJwJJZacdSji9XSRkPKUw== +cypress@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-4.4.1.tgz#f5aa1aa5f328f1299bff328103f7cbad89e80f29" + integrity sha512-LcskZ/PXRG9XTlEeeenKqz/KddT1x+7O7dqXsdKWPII01LxLNmNHIvHnlUqApchVbinJ5vir6J255CkELSeL0A== dependencies: "@cypress/listr-verbose-renderer" "0.4.1" + "@cypress/request" "2.88.5" "@cypress/xvfb" "1.2.4" + "@types/blob-util" "1.3.3" + "@types/bluebird" "3.5.29" + "@types/chai" "4.2.7" + "@types/chai-jquery" "1.1.40" + "@types/jquery" "3.3.31" + "@types/lodash" "4.14.149" + "@types/minimatch" "3.0.3" + "@types/mocha" "5.2.7" + "@types/sinon" "7.5.1" + "@types/sinon-chai" "3.2.3" "@types/sizzle" "2.3.2" arch "2.1.1" bluebird "3.7.2" @@ -10390,7 +10480,7 @@ cypress@^4.2.0: eventemitter2 "4.1.2" execa "1.0.0" executable "4.1.1" - extract-zip "1.6.7" + extract-zip "1.7.0" fs-extra "8.1.0" getos "3.1.4" is-ci "2.0.0" @@ -10399,12 +10489,11 @@ cypress@^4.2.0: listr "0.14.3" lodash "4.17.15" log-symbols "3.0.0" - minimist "1.2.2" + minimist "1.2.5" moment "2.24.0" ospath "1.2.2" pretty-bytes "5.3.0" ramda "0.26.1" - request cypress-io/request#b5af0d1fa47eec97ba980cde90a13e69a2afcd16 request-progress "3.0.0" supports-color "7.1.0" tmp "0.1.0" @@ -13187,16 +13276,6 @@ extract-stack@^1.0.0: resolved "https://registry.yarnpkg.com/extract-stack/-/extract-stack-1.0.0.tgz#b97acaf9441eea2332529624b732fc5a1c8165fa" integrity sha1-uXrK+UQe6iMyUpYktzL8WhyBZfo= -extract-zip@1.6.7: - version "1.6.7" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" - integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= - dependencies: - concat-stream "1.6.2" - debug "2.6.9" - mkdirp "0.5.1" - yauzl "2.4.1" - extract-zip@1.7.0, extract-zip@^1.6.6, extract-zip@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" @@ -20579,12 +20658,7 @@ minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2 resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minimist@1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.2.tgz#b00a00230a1108c48c169e69a291aafda3aacd63" - integrity sha512-rIqbOrKb8GJmx/5bc2M0QchhUouMXSpd1RTclXsB41JdL+VtnojfaJR+h7F9k18/4kHUsBFgk80Uk+q569vjPA== - -minimist@^1.2.3, minimist@^1.2.5: +minimist@1.2.5, minimist@^1.2.3, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -25793,31 +25867,6 @@ request@^2.87.0: tunnel-agent "^0.6.0" uuid "^3.1.0" -request@cypress-io/request#b5af0d1fa47eec97ba980cde90a13e69a2afcd16: - version "2.88.1" - resolved "https://codeload.github.com/cypress-io/request/tar.gz/b5af0d1fa47eec97ba980cde90a13e69a2afcd16" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - require-ancestors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/require-ancestors/-/require-ancestors-1.0.0.tgz#807831f8f8081fb12863da81ddb15c8f2a73a004" @@ -32456,13 +32505,6 @@ yauzl@2.10.0, yauzl@^2.10.0: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" -yauzl@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" - integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= - dependencies: - fd-slicer "~1.0.1" - yauzl@^2.4.2: version "2.9.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.9.1.tgz#a81981ea70a57946133883f029c5821a89359a7f" From 6c98b2368bc7df5d3d4203d82960420546c37f29 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Mon, 27 Apr 2020 09:06:33 -0400 Subject: [PATCH 25/26] [Ingest] Add Global settings flyout (#64276) --- .../ingest_manager/common/constants/index.ts | 1 + .../ingest_manager/common/constants/routes.ts | 13 + .../common/constants/settings.ts | 7 + .../ingest_manager/common/services/routes.ts | 14 + .../common/types/models/index.ts | 1 + .../common/types/models/settings.ts | 19 ++ .../common/types/rest_spec/index.ts | 2 + .../common/types/rest_spec/output.ts | 40 +++ .../common/types/rest_spec/settings.ts | 20 ++ .../ingest_manager/components/index.ts | 1 + .../components/settings_flyout.tsx | 240 ++++++++++++++++++ .../ingest_manager/hooks/use_input.ts | 22 ++ .../ingest_manager/hooks/use_request/index.ts | 2 + .../hooks/use_request/outputs.ts | 24 ++ .../hooks/use_request/settings.ts | 24 ++ .../ingest_manager/layouts/default.tsx | 126 +++++---- .../ingest_manager/services/index.ts | 2 + .../ingest_manager/types/index.ts | 9 + .../ingest_manager/server/constants/index.ts | 3 + .../plugins/ingest_manager/server/plugin.ts | 4 + .../ingest_manager/server/routes/index.ts | 2 + .../server/routes/output/handler.ts | 90 +++++++ .../server/routes/output/index.ts | 41 +++ .../server/routes/settings/index.ts | 81 ++++++ .../ingest_manager/server/saved_objects.ts | 18 ++ .../ingest_manager/server/services/index.ts | 4 +- .../ingest_manager/server/services/output.ts | 28 ++ .../server/services/settings.ts | 57 +++++ .../ingest_manager/server/services/setup.ts | 13 + .../ingest_manager/server/types/index.tsx | 2 + .../server/types/rest_spec/index.ts | 2 + .../server/types/rest_spec/output.ts | 24 ++ .../server/types/rest_spec/settings.ts | 17 ++ 33 files changed, 899 insertions(+), 54 deletions(-) create mode 100644 x-pack/plugins/ingest_manager/common/constants/settings.ts create mode 100644 x-pack/plugins/ingest_manager/common/types/models/settings.ts create mode 100644 x-pack/plugins/ingest_manager/common/types/rest_spec/output.ts create mode 100644 x-pack/plugins/ingest_manager/common/types/rest_spec/settings.ts create mode 100644 x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/settings_flyout.tsx create mode 100644 x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/outputs.ts create mode 100644 x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/settings.ts create mode 100644 x-pack/plugins/ingest_manager/server/routes/output/handler.ts create mode 100644 x-pack/plugins/ingest_manager/server/routes/output/index.ts create mode 100644 x-pack/plugins/ingest_manager/server/routes/settings/index.ts create mode 100644 x-pack/plugins/ingest_manager/server/services/settings.ts create mode 100644 x-pack/plugins/ingest_manager/server/types/rest_spec/output.ts create mode 100644 x-pack/plugins/ingest_manager/server/types/rest_spec/settings.ts diff --git a/x-pack/plugins/ingest_manager/common/constants/index.ts b/x-pack/plugins/ingest_manager/common/constants/index.ts index 45d315e6d5664..6a2e559bbbe4f 100644 --- a/x-pack/plugins/ingest_manager/common/constants/index.ts +++ b/x-pack/plugins/ingest_manager/common/constants/index.ts @@ -12,3 +12,4 @@ export * from './datasource'; export * from './epm'; export * from './output'; export * from './enrollment_api_key'; +export * from './settings'; diff --git a/x-pack/plugins/ingest_manager/common/constants/routes.ts b/x-pack/plugins/ingest_manager/common/constants/routes.ts index 98ca52651a2ae..35e3be98e3982 100644 --- a/x-pack/plugins/ingest_manager/common/constants/routes.ts +++ b/x-pack/plugins/ingest_manager/common/constants/routes.ts @@ -48,6 +48,19 @@ export const AGENT_CONFIG_API_ROUTES = { FULL_INFO_PATTERN: `${AGENT_CONFIG_API_ROOT}/{agentConfigId}/full`, }; +// Output API routes +export const OUTPUT_API_ROUTES = { + LIST_PATTERN: `${API_ROOT}/outputs`, + INFO_PATTERN: `${API_ROOT}/outputs/{outputId}`, + UPDATE_PATTERN: `${API_ROOT}/outputs/{outputId}`, +}; + +// Settings API routes +export const SETTINGS_API_ROUTES = { + INFO_PATTERN: `${API_ROOT}/settings`, + UPDATE_PATTERN: `${API_ROOT}/settings`, +}; + // Agent API routes export const AGENT_API_ROUTES = { LIST_PATTERN: `${FLEET_API_ROOT}/agents`, diff --git a/x-pack/plugins/ingest_manager/common/constants/settings.ts b/x-pack/plugins/ingest_manager/common/constants/settings.ts new file mode 100644 index 0000000000000..a9e7f1df4119c --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/constants/settings.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export const GLOBAL_SETTINGS_SAVED_OBJECT_TYPE = 'ingest_manager_settings'; diff --git a/x-pack/plugins/ingest_manager/common/services/routes.ts b/x-pack/plugins/ingest_manager/common/services/routes.ts index 46b76d886f3cd..1a1bd7c65aa25 100644 --- a/x-pack/plugins/ingest_manager/common/services/routes.ts +++ b/x-pack/plugins/ingest_manager/common/services/routes.ts @@ -13,6 +13,8 @@ import { AGENT_API_ROUTES, ENROLLMENT_API_KEY_ROUTES, SETUP_API_ROUTE, + OUTPUT_API_ROUTES, + SETTINGS_API_ROUTES, } from '../constants'; export const epmRouteService = { @@ -112,6 +114,18 @@ export const agentRouteService = { getStatusPath: () => AGENT_API_ROUTES.STATUS_PATTERN, }; +export const outputRoutesService = { + getInfoPath: (outputId: string) => OUTPUT_API_ROUTES.INFO_PATTERN.replace('{outputId}', outputId), + getUpdatePath: (outputId: string) => + OUTPUT_API_ROUTES.UPDATE_PATTERN.replace('{outputId}', outputId), + getListPath: () => OUTPUT_API_ROUTES.LIST_PATTERN, +}; + +export const settingsRoutesService = { + getInfoPath: () => SETTINGS_API_ROUTES.INFO_PATTERN, + getUpdatePath: () => SETTINGS_API_ROUTES.UPDATE_PATTERN, +}; + export const enrollmentAPIKeyRouteService = { getListPath: () => ENROLLMENT_API_KEY_ROUTES.LIST_PATTERN, getCreatePath: () => ENROLLMENT_API_KEY_ROUTES.CREATE_PATTERN, diff --git a/x-pack/plugins/ingest_manager/common/types/models/index.ts b/x-pack/plugins/ingest_manager/common/types/models/index.ts index f73ab7af636a9..2310fdd54a719 100644 --- a/x-pack/plugins/ingest_manager/common/types/models/index.ts +++ b/x-pack/plugins/ingest_manager/common/types/models/index.ts @@ -11,3 +11,4 @@ export * from './data_stream'; export * from './output'; export * from './epm'; export * from './enrollment_api_key'; +export * from './settings'; diff --git a/x-pack/plugins/ingest_manager/common/types/models/settings.ts b/x-pack/plugins/ingest_manager/common/types/models/settings.ts new file mode 100644 index 0000000000000..2921808230b47 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/types/models/settings.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { SavedObjectAttributes } from 'src/core/public'; + +interface BaseSettings { + agent_auto_upgrade?: boolean; + package_auto_upgrade?: boolean; + kibana_url?: string; + kibana_ca_sha256?: string; +} + +export interface Settings extends BaseSettings { + id: string; +} + +export interface SettingsSOAttributes extends BaseSettings, SavedObjectAttributes {} diff --git a/x-pack/plugins/ingest_manager/common/types/rest_spec/index.ts b/x-pack/plugins/ingest_manager/common/types/rest_spec/index.ts index c1805023f497a..763fb7d820b2a 100644 --- a/x-pack/plugins/ingest_manager/common/types/rest_spec/index.ts +++ b/x-pack/plugins/ingest_manager/common/types/rest_spec/index.ts @@ -12,3 +12,5 @@ export * from './fleet_setup'; export * from './epm'; export * from './enrollment_api_key'; export * from './install_script'; +export * from './output'; +export * from './settings'; diff --git a/x-pack/plugins/ingest_manager/common/types/rest_spec/output.ts b/x-pack/plugins/ingest_manager/common/types/rest_spec/output.ts new file mode 100644 index 0000000000000..4162060363381 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/types/rest_spec/output.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { Output } from '../models'; + +export interface GetOneOutputResponse { + item: Output; + success: boolean; +} + +export interface GetOneOutputRequest { + params: { + outputId: string; + }; +} + +export interface PutOutputRequest { + params: { + outputId: string; + }; + body: { + hosts?: string[]; + ca_sha256?: string; + }; +} + +export interface PutOutputResponse { + item: Output; + success: boolean; +} + +export interface GetOutputsResponse { + items: Output[]; + total: number; + page: number; + perPage: number; + success: boolean; +} diff --git a/x-pack/plugins/ingest_manager/common/types/rest_spec/settings.ts b/x-pack/plugins/ingest_manager/common/types/rest_spec/settings.ts new file mode 100644 index 0000000000000..c02a5e5878ee9 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/types/rest_spec/settings.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { Settings } from '../models'; + +export interface GetSettingsResponse { + item: Settings; + success: boolean; +} + +export interface PutSettingsRequest { + body: Partial>; +} + +export interface PutSettingsResponse { + item: Settings; + success: boolean; +} diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/index.ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/index.ts index bdc8f350f7108..b0b4e79cece79 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/index.ts +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/index.ts @@ -7,3 +7,4 @@ export { Loading } from './loading'; export { Error } from './error'; export { Header, HeaderProps } from './header'; export { AlphaMessaging } from './alpha_messaging'; +export * from './settings_flyout'; diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/settings_flyout.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/settings_flyout.tsx new file mode 100644 index 0000000000000..92146e9ee5679 --- /dev/null +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/settings_flyout.tsx @@ -0,0 +1,240 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { useEffect } from 'react'; +import { i18n } from '@kbn/i18n'; +import { + EuiFlyout, + EuiFlyoutBody, + EuiFlyoutHeader, + EuiTitle, + EuiFlexGroup, + EuiFlexItem, + EuiButtonEmpty, + EuiSpacer, + EuiButton, + EuiFlyoutFooter, + EuiForm, + EuiFormRow, + EuiFieldText, + EuiRadioGroup, + EuiComboBox, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiText } from '@elastic/eui'; +import { useInput, useComboInput, useCore, useGetSettings, sendPutSettings } from '../hooks'; +import { useGetOutputs, sendPutOutput } from '../hooks/use_request/outputs'; + +interface Props { + onClose: () => void; +} + +function useSettingsForm(outputId: string | undefined) { + const { notifications } = useCore(); + const kibanaUrlInput = useInput(); + const elasticsearchUrlInput = useComboInput([]); + + return { + onSubmit: async () => { + try { + if (!outputId) { + throw new Error('Unable to load outputs'); + } + await sendPutOutput(outputId, { + hosts: elasticsearchUrlInput.value, + }); + await sendPutSettings({ + kibana_url: kibanaUrlInput.value, + }); + } catch (error) { + notifications.toasts.addError(error, { + title: 'Error', + }); + } + notifications.toasts.addSuccess( + i18n.translate('xpack.ingestManager.settings.success.message', { + defaultMessage: 'Settings saved', + }) + ); + }, + inputs: { + kibanaUrl: kibanaUrlInput, + elasticsearchUrl: elasticsearchUrlInput, + }, + }; +} + +export const SettingFlyout: React.FunctionComponent = ({ onClose }) => { + const core = useCore(); + const settingsRequest = useGetSettings(); + const settings = settingsRequest?.data?.item; + const outputsRequest = useGetOutputs(); + const output = outputsRequest.data?.items?.[0]; + const { inputs, onSubmit } = useSettingsForm(output?.id); + + useEffect(() => { + if (output) { + inputs.elasticsearchUrl.setValue(output.hosts || []); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [output]); + + useEffect(() => { + if (settings) { + inputs.kibanaUrl.setValue( + settings.kibana_url || `${window.location.origin}${core.http.basePath.get()}` + ); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [settings]); + + const body = ( + + {}} + legend={{ + children: ( + +

+ +

+
+ ), + }} + /> + + {}} + legend={{ + children: ( + +

+ +

+
+ ), + }} + /> + + +

+ +

+
+ + + + + + + + + + + + + + + + +
+ ); + + return ( + + + +

+ +

+
+
+ {body} + + + + + + + + + + + + + + +
+ ); +}; diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_input.ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_input.ts index 4aa0ad7155d2f..c535dc899638d 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_input.ts +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_input.ts @@ -20,5 +20,27 @@ export function useInput(defaultValue = '') { clear: () => { setValue(''); }, + setValue, + }; +} + +export function useComboInput(defaultValue = []) { + const [value, setValue] = React.useState(defaultValue); + + return { + props: { + selectedOptions: value.map((val: string) => ({ label: val })), + onCreateOption: (newVal: any) => { + setValue([...value, newVal]); + }, + onChange: (newVals: any[]) => { + setValue(newVals.map(val => val.label)); + }, + }, + value, + clear: () => { + setValue([]); + }, + setValue, }; } diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/index.ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/index.ts index 084aba9a34309..c39d2a5860bf0 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/index.ts +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/index.ts @@ -10,3 +10,5 @@ export * from './data_stream'; export * from './agents'; export * from './enrollment_api_keys'; export * from './epm'; +export * from './outputs'; +export * from './settings'; diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/outputs.ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/outputs.ts new file mode 100644 index 0000000000000..e57256d33ab2f --- /dev/null +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/outputs.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { sendRequest, useRequest } from './use_request'; +import { outputRoutesService } from '../../services'; +import { PutOutputRequest, GetOutputsResponse } from '../../types'; + +export function useGetOutputs() { + return useRequest({ + method: 'get', + path: outputRoutesService.getListPath(), + }); +} + +export function sendPutOutput(outputId: string, body: PutOutputRequest['body']) { + return sendRequest({ + method: 'put', + path: outputRoutesService.getUpdatePath(outputId), + body, + }); +} diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/settings.ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/settings.ts new file mode 100644 index 0000000000000..45e4eccf6625e --- /dev/null +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/settings.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { sendRequest, useRequest } from './use_request'; +import { settingsRoutesService } from '../../services'; +import { PutSettingsResponse, PutSettingsRequest, GetSettingsResponse } from '../../types'; + +export function useGetSettings() { + return useRequest({ + method: 'get', + path: settingsRoutesService.getInfoPath(), + }); +} + +export function sendPutSettings(body: PutSettingsRequest['body']) { + return sendRequest({ + method: 'put', + path: settingsRoutesService.getUpdatePath(), + body, + }); +} diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx index f1f9063de72f0..10245e73520f7 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/layouts/default.tsx @@ -5,10 +5,10 @@ */ import React from 'react'; import styled from 'styled-components'; -import { EuiTabs, EuiTab, EuiFlexGroup, EuiFlexItem, EuiIcon } from '@elastic/eui'; +import { EuiTabs, EuiTab, EuiFlexGroup, EuiFlexItem, EuiIcon, EuiButtonEmpty } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { Section } from '../sections'; -import { AlphaMessaging } from '../components'; +import { AlphaMessaging, SettingFlyout } from '../components'; import { useLink, useConfig } from '../hooks'; import { EPM_PATH, FLEET_PATH, AGENT_CONFIG_PATH, DATA_STREAM_PATH } from '../constants'; @@ -35,59 +35,79 @@ const Nav = styled.nav` export const DefaultLayout: React.FunctionComponent = ({ section, children }) => { const { epm, fleet } = useConfig(); + + const [isSettingsFlyoutOpen, setIsSettingsFlyoutOpen] = React.useState(false); + return ( - - + {children} + + + ); }; diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/services/index.ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/services/index.ts index 53dbe295718c5..e4791cc816d04 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/services/index.ts +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/services/index.ts @@ -15,6 +15,8 @@ export { enrollmentAPIKeyRouteService, epmRouteService, setupRouteService, + outputRoutesService, + settingsRoutesService, packageToConfigDatasourceInputs, storedDatasourceToAgentDatasource, AgentStatusKueryHelper, diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/types/index.ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/types/index.ts index 8ca1495a94071..2f78ecd1b085e 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/types/index.ts +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/types/index.ts @@ -17,6 +17,7 @@ export { DatasourceInput, DatasourceInputStream, DatasourceConfigRecordEntry, + Output, DataStream, // API schemas - Agent Config GetAgentConfigsResponse, @@ -48,6 +49,14 @@ export { GetEnrollmentAPIKeysResponse, GetEnrollmentAPIKeysRequest, GetOneEnrollmentAPIKeyResponse, + // API schemas - Outputs + GetOutputsResponse, + PutOutputRequest, + PutOutputResponse, + // API schemas - Settings + GetSettingsResponse, + PutSettingsRequest, + PutSettingsResponse, // EPM types AssetReference, AssetsGroupedByServiceByType, diff --git a/x-pack/plugins/ingest_manager/server/constants/index.ts b/x-pack/plugins/ingest_manager/server/constants/index.ts index 9336b3f870e00..75c14ffc8fa84 100644 --- a/x-pack/plugins/ingest_manager/server/constants/index.ts +++ b/x-pack/plugins/ingest_manager/server/constants/index.ts @@ -19,7 +19,9 @@ export { FLEET_SETUP_API_ROUTES, ENROLLMENT_API_KEY_ROUTES, INSTALL_SCRIPT_API_ROUTES, + OUTPUT_API_ROUTES, SETUP_API_ROUTE, + SETTINGS_API_ROUTES, // Saved object types AGENT_SAVED_OBJECT_TYPE, AGENT_EVENT_SAVED_OBJECT_TYPE, @@ -30,6 +32,7 @@ export { PACKAGES_SAVED_OBJECT_TYPE, INDEX_PATTERN_SAVED_OBJECT_TYPE, ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE, + GLOBAL_SETTINGS_SAVED_OBJECT_TYPE as GLOBAL_SETTINGS_SAVED_OBJET_TYPE, // Defaults DEFAULT_AGENT_CONFIG, DEFAULT_OUTPUT, diff --git a/x-pack/plugins/ingest_manager/server/plugin.ts b/x-pack/plugins/ingest_manager/server/plugin.ts index 4bf9785dcd306..097825e0b69e1 100644 --- a/x-pack/plugins/ingest_manager/server/plugin.ts +++ b/x-pack/plugins/ingest_manager/server/plugin.ts @@ -39,6 +39,8 @@ import { registerAgentRoutes, registerEnrollmentApiKeyRoutes, registerInstallScriptRoutes, + registerOutputRoutes, + registerSettingsRoutes, } from './routes'; import { IngestManagerConfigType } from '../common'; @@ -150,6 +152,8 @@ export class IngestManagerPlugin // Register routes registerAgentConfigRoutes(router); registerDatasourceRoutes(router); + registerOutputRoutes(router); + registerSettingsRoutes(router); registerDataStreamRoutes(router); // Conditional routes diff --git a/x-pack/plugins/ingest_manager/server/routes/index.ts b/x-pack/plugins/ingest_manager/server/routes/index.ts index 8a186c5485024..3ce34d15de46c 100644 --- a/x-pack/plugins/ingest_manager/server/routes/index.ts +++ b/x-pack/plugins/ingest_manager/server/routes/index.ts @@ -11,3 +11,5 @@ export { registerRoutes as registerSetupRoutes } from './setup'; export { registerRoutes as registerAgentRoutes } from './agent'; export { registerRoutes as registerEnrollmentApiKeyRoutes } from './enrollment_api_key'; export { registerRoutes as registerInstallScriptRoutes } from './install_script'; +export { registerRoutes as registerOutputRoutes } from './output'; +export { registerRoutes as registerSettingsRoutes } from './settings'; diff --git a/x-pack/plugins/ingest_manager/server/routes/output/handler.ts b/x-pack/plugins/ingest_manager/server/routes/output/handler.ts new file mode 100644 index 0000000000000..cd35b2a43426c --- /dev/null +++ b/x-pack/plugins/ingest_manager/server/routes/output/handler.ts @@ -0,0 +1,90 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { RequestHandler } from 'src/core/server'; +import { TypeOf } from '@kbn/config-schema'; +import { GetOneOutputRequestSchema, PutOutputRequestSchema } from '../../types'; +import { GetOneOutputResponse, GetOutputsResponse } from '../../../common'; +import { outputService } from '../../services/output'; + +export const getOutputsHandler: RequestHandler = async (context, request, response) => { + const soClient = context.core.savedObjects.client; + try { + const outputs = await outputService.list(soClient); + + const body: GetOutputsResponse = { + items: outputs.items, + page: outputs.page, + perPage: outputs.perPage, + total: outputs.total, + success: true, + }; + + return response.ok({ body }); + } catch (e) { + return response.customError({ + statusCode: 500, + body: { message: e.message }, + }); + } +}; + +export const getOneOuputHandler: RequestHandler> = async (context, request, response) => { + const soClient = context.core.savedObjects.client; + try { + const output = await outputService.get(soClient, request.params.outputId); + + const body: GetOneOutputResponse = { + item: output, + success: true, + }; + + return response.ok({ body }); + } catch (e) { + if (e.isBoom && e.output.statusCode === 404) { + return response.notFound({ + body: { message: `Output ${request.params.outputId} not found` }, + }); + } + + return response.customError({ + statusCode: 500, + body: { message: e.message }, + }); + } +}; + +export const putOuputHandler: RequestHandler< + TypeOf, + undefined, + TypeOf +> = async (context, request, response) => { + const soClient = context.core.savedObjects.client; + try { + await outputService.update(soClient, request.params.outputId, request.body); + const output = await outputService.get(soClient, request.params.outputId); + + const body: GetOneOutputResponse = { + item: output, + success: true, + }; + + return response.ok({ body }); + } catch (e) { + if (e.isBoom && e.output.statusCode === 404) { + return response.notFound({ + body: { message: `Output ${request.params.outputId} not found` }, + }); + } + + return response.customError({ + statusCode: 500, + body: { message: e.message }, + }); + } +}; diff --git a/x-pack/plugins/ingest_manager/server/routes/output/index.ts b/x-pack/plugins/ingest_manager/server/routes/output/index.ts new file mode 100644 index 0000000000000..139d11dba951a --- /dev/null +++ b/x-pack/plugins/ingest_manager/server/routes/output/index.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { IRouter } from 'src/core/server'; +import { PLUGIN_ID, OUTPUT_API_ROUTES } from '../../constants'; +import { getOneOuputHandler, getOutputsHandler, putOuputHandler } from './handler'; +import { + GetOneOutputRequestSchema, + GetOutputsRequestSchema, + PutOutputRequestSchema, +} from '../../types'; + +export const registerRoutes = (router: IRouter) => { + router.get( + { + path: OUTPUT_API_ROUTES.LIST_PATTERN, + validate: GetOutputsRequestSchema, + options: { tags: [`access:${PLUGIN_ID}-read`] }, + }, + getOutputsHandler + ); + router.get( + { + path: OUTPUT_API_ROUTES.INFO_PATTERN, + validate: GetOneOutputRequestSchema, + options: { tags: [`access:${PLUGIN_ID}-read`] }, + }, + getOneOuputHandler + ); + router.put( + { + path: OUTPUT_API_ROUTES.UPDATE_PATTERN, + validate: PutOutputRequestSchema, + options: { tags: [`access:${PLUGIN_ID}-read`] }, + }, + putOuputHandler + ); +}; diff --git a/x-pack/plugins/ingest_manager/server/routes/settings/index.ts b/x-pack/plugins/ingest_manager/server/routes/settings/index.ts new file mode 100644 index 0000000000000..56e666056e8d0 --- /dev/null +++ b/x-pack/plugins/ingest_manager/server/routes/settings/index.ts @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { IRouter, RequestHandler } from 'src/core/server'; +import { TypeOf } from '@kbn/config-schema'; +import { PLUGIN_ID, SETTINGS_API_ROUTES } from '../../constants'; +import { PutSettingsRequestSchema, GetSettingsRequestSchema } from '../../types'; + +import { settingsService } from '../../services'; + +export const getSettingsHandler: RequestHandler = async (context, request, response) => { + const soClient = context.core.savedObjects.client; + + try { + const settings = await settingsService.getSettings(soClient); + const body = { + success: true, + item: settings, + }; + return response.ok({ body }); + } catch (e) { + if (e.isBoom && e.output.statusCode === 404) { + return response.notFound({ + body: { message: `Setings not found` }, + }); + } + + return response.customError({ + statusCode: 500, + body: { message: e.message }, + }); + } +}; + +export const putSettingsHandler: RequestHandler< + undefined, + undefined, + TypeOf +> = async (context, request, response) => { + const soClient = context.core.savedObjects.client; + try { + const settings = await settingsService.saveSettings(soClient, request.body); + const body = { + success: true, + item: settings, + }; + return response.ok({ body }); + } catch (e) { + if (e.isBoom && e.output.statusCode === 404) { + return response.notFound({ + body: { message: `Setings not found` }, + }); + } + + return response.customError({ + statusCode: 500, + body: { message: e.message }, + }); + } +}; + +export const registerRoutes = (router: IRouter) => { + router.get( + { + path: SETTINGS_API_ROUTES.INFO_PATTERN, + validate: GetSettingsRequestSchema, + options: { tags: [`access:${PLUGIN_ID}-read`] }, + }, + getSettingsHandler + ); + router.put( + { + path: SETTINGS_API_ROUTES.UPDATE_PATTERN, + validate: PutSettingsRequestSchema, + options: { tags: [`access:${PLUGIN_ID}-all`] }, + }, + putSettingsHandler + ); +}; diff --git a/x-pack/plugins/ingest_manager/server/saved_objects.ts b/x-pack/plugins/ingest_manager/server/saved_objects.ts index d827fb776b12c..0b130e7b70101 100644 --- a/x-pack/plugins/ingest_manager/server/saved_objects.ts +++ b/x-pack/plugins/ingest_manager/server/saved_objects.ts @@ -15,6 +15,7 @@ import { AGENT_EVENT_SAVED_OBJECT_TYPE, AGENT_ACTION_SAVED_OBJECT_TYPE, ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE, + GLOBAL_SETTINGS_SAVED_OBJET_TYPE, } from './constants'; /* @@ -22,7 +23,24 @@ import { * * Please update typings in `/common/types` if mappings are updated. */ + const savedObjectTypes: { [key: string]: SavedObjectsType } = { + [GLOBAL_SETTINGS_SAVED_OBJET_TYPE]: { + name: GLOBAL_SETTINGS_SAVED_OBJET_TYPE, + hidden: false, + namespaceType: 'agnostic', + management: { + importableAndExportable: false, + }, + mappings: { + properties: { + agent_auto_upgrade: { type: 'keyword' }, + package_auto_upgrade: { type: 'keyword' }, + kibana_url: { type: 'keyword' }, + kibana_ca_sha256: { type: 'keyword' }, + }, + }, + }, [AGENT_SAVED_OBJECT_TYPE]: { name: AGENT_SAVED_OBJECT_TYPE, hidden: false, diff --git a/x-pack/plugins/ingest_manager/server/services/index.ts b/x-pack/plugins/ingest_manager/server/services/index.ts index 5141c86516f13..483661b9de915 100644 --- a/x-pack/plugins/ingest_manager/server/services/index.ts +++ b/x-pack/plugins/ingest_manager/server/services/index.ts @@ -3,9 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + import { SavedObjectsClientContract } from 'kibana/server'; import { AgentStatus } from '../../common/types/models'; - +import * as settingsService from './settings'; export { ESIndexPatternSavedObjectService } from './es_index_pattern'; /** @@ -35,6 +36,7 @@ export interface AgentService { export { datasourceService } from './datasource'; export { agentConfigService } from './agent_config'; export { outputService } from './output'; +export { settingsService }; // Plugin services export { appContextService } from './app_context'; diff --git a/x-pack/plugins/ingest_manager/server/services/output.ts b/x-pack/plugins/ingest_manager/server/services/output.ts index 6c0dce79d550d..395c9af4a4ca2 100644 --- a/x-pack/plugins/ingest_manager/server/services/output.ts +++ b/x-pack/plugins/ingest_manager/server/services/output.ts @@ -95,6 +95,34 @@ class OutputService { ...outputSO.attributes, }; } + + public async update(soClient: SavedObjectsClientContract, id: string, data: Partial) { + const outputSO = await soClient.update(SAVED_OBJECT_TYPE, id, data); + + if (outputSO.error) { + throw new Error(outputSO.error.message); + } + } + + public async list(soClient: SavedObjectsClientContract) { + const outputs = await soClient.find({ + type: SAVED_OBJECT_TYPE, + page: 1, + perPage: 1000, + }); + + return { + items: outputs.saved_objects.map(outputSO => { + return { + id: outputSO.id, + ...outputSO.attributes, + }; + }), + total: outputs.total, + page: 1, + perPage: 1000, + }; + } } export const outputService = new OutputService(); diff --git a/x-pack/plugins/ingest_manager/server/services/settings.ts b/x-pack/plugins/ingest_manager/server/services/settings.ts new file mode 100644 index 0000000000000..f1c09746d9abd --- /dev/null +++ b/x-pack/plugins/ingest_manager/server/services/settings.ts @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import Boom from 'boom'; +import { SavedObjectsClientContract } from 'kibana/server'; +import { GLOBAL_SETTINGS_SAVED_OBJECT_TYPE, SettingsSOAttributes, Settings } from '../../common'; + +export async function getSettings(soClient: SavedObjectsClientContract): Promise { + const res = await soClient.find({ + type: GLOBAL_SETTINGS_SAVED_OBJECT_TYPE, + }); + + if (res.total === 0) { + throw Boom.notFound('Global settings not found'); + } + const settingsSo = res.saved_objects[0]; + return { + id: settingsSo.id, + ...settingsSo.attributes, + }; +} + +export async function saveSettings( + soClient: SavedObjectsClientContract, + newData: Partial> +): Promise { + try { + const settings = await getSettings(soClient); + + const res = await soClient.update( + GLOBAL_SETTINGS_SAVED_OBJECT_TYPE, + settings.id, + newData + ); + + return { + id: settings.id, + ...res.attributes, + }; + } catch (e) { + if (e.isBoom && e.output.statusCode === 404) { + const res = await soClient.create( + GLOBAL_SETTINGS_SAVED_OBJECT_TYPE, + newData + ); + + return { + id: res.id, + ...res.attributes, + }; + } + + throw e; + } +} diff --git a/x-pack/plugins/ingest_manager/server/services/setup.ts b/x-pack/plugins/ingest_manager/server/services/setup.ts index 167a24481aba5..206ad76703cf5 100644 --- a/x-pack/plugins/ingest_manager/server/services/setup.ts +++ b/x-pack/plugins/ingest_manager/server/services/setup.ts @@ -21,6 +21,8 @@ import { import { getPackageInfo } from './epm/packages'; import { datasourceService } from './datasource'; import { generateEnrollmentAPIKey } from './api_keys'; +import { settingsService } from '.'; +import { appContextService } from './app_context'; const FLEET_ENROLL_USERNAME = 'fleet_enroll'; const FLEET_ENROLL_ROLE = 'fleet_enroll'; @@ -34,6 +36,17 @@ export async function setupIngestManager( ensureInstalledDefaultPackages(soClient, callCluster), outputService.ensureDefaultOutput(soClient), agentConfigService.ensureDefaultAgentConfig(soClient), + settingsService.getSettings(soClient).catch((e: any) => { + if (e.isBoom && e.output.statusCode === 404) { + return settingsService.saveSettings(soClient, { + agent_auto_upgrade: true, + package_auto_upgrade: true, + kibana_url: appContextService.getConfig()?.fleet?.kibana?.host, + }); + } + + return Promise.reject(e); + }), ]); // ensure default packages are added to the default conifg diff --git a/x-pack/plugins/ingest_manager/server/types/index.tsx b/x-pack/plugins/ingest_manager/server/types/index.tsx index aa5496cc836b7..a7019ebc0a271 100644 --- a/x-pack/plugins/ingest_manager/server/types/index.tsx +++ b/x-pack/plugins/ingest_manager/server/types/index.tsx @@ -50,6 +50,8 @@ export { DefaultPackages, TemplateRef, IndexTemplateMappings, + Settings, + SettingsSOAttributes, } from '../../common'; export type CallESAsCurrentUser = ScopedClusterClient['callAsCurrentUser']; diff --git a/x-pack/plugins/ingest_manager/server/types/rest_spec/index.ts b/x-pack/plugins/ingest_manager/server/types/rest_spec/index.ts index 42b607fa1c715..6976dae38d5f1 100644 --- a/x-pack/plugins/ingest_manager/server/types/rest_spec/index.ts +++ b/x-pack/plugins/ingest_manager/server/types/rest_spec/index.ts @@ -10,3 +10,5 @@ export * from './datasource'; export * from './epm'; export * from './enrollment_api_key'; export * from './install_script'; +export * from './output'; +export * from './settings'; diff --git a/x-pack/plugins/ingest_manager/server/types/rest_spec/output.ts b/x-pack/plugins/ingest_manager/server/types/rest_spec/output.ts new file mode 100644 index 0000000000000..79a7c444dacdb --- /dev/null +++ b/x-pack/plugins/ingest_manager/server/types/rest_spec/output.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { schema } from '@kbn/config-schema'; + +export const GetOneOutputRequestSchema = { + params: schema.object({ + outputId: schema.string(), + }), +}; + +export const GetOutputsRequestSchema = {}; + +export const PutOutputRequestSchema = { + params: schema.object({ + outputId: schema.string(), + }), + body: schema.object({ + hosts: schema.maybe(schema.arrayOf(schema.string())), + ca_sha256: schema.maybe(schema.string()), + }), +}; diff --git a/x-pack/plugins/ingest_manager/server/types/rest_spec/settings.ts b/x-pack/plugins/ingest_manager/server/types/rest_spec/settings.ts new file mode 100644 index 0000000000000..8b7500e4a9bd9 --- /dev/null +++ b/x-pack/plugins/ingest_manager/server/types/rest_spec/settings.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { schema } from '@kbn/config-schema'; + +export const GetSettingsRequestSchema = {}; + +export const PutSettingsRequestSchema = { + body: schema.object({ + agent_auto_upgrade: schema.maybe(schema.boolean()), + package_auto_upgrade: schema.maybe(schema.boolean()), + kibana_url: schema.maybe(schema.string()), + kibana_ca_sha256: schema.maybe(schema.string()), + }), +}; From fe79979328b38b1394a945ff47b8194188238f3f Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Mon, 27 Apr 2020 15:13:13 +0200 Subject: [PATCH 26/26] [ML] Functional tests - stabilize job row details validations (#64503) This PR stabilizes the AD job row details check by only validating expected properties instead of the whole object. --- .../anomaly_detection/advanced_job.ts | 4 -- .../anomaly_detection/categorization_job.ts | 1 - .../anomaly_detection/date_nanos_job.ts | 2 - .../anomaly_detection/multi_metric_job.ts | 1 - .../anomaly_detection/population_job.ts | 1 - .../anomaly_detection/saved_search_job.ts | 6 -- .../anomaly_detection/single_metric_job.ts | 1 - .../functional/apps/machine_learning/pages.ts | 2 +- .../services/machine_learning/job_table.ts | 56 ++++++------------- 9 files changed, 19 insertions(+), 55 deletions(-) diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/advanced_job.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/advanced_job.ts index e238937ee845f..a9133bb380179 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/advanced_job.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/advanced_job.ts @@ -195,7 +195,6 @@ export default function({ getService }: FtrProviderContext) { modelSizeStats: { result_type: 'model_size_stats', model_bytes_exceeded: '0.0 B', - model_bytes_memory_limit: '10.0 MB', total_by_field_count: '37', total_over_field_count: '92', total_partition_field_count: '8', @@ -262,7 +261,6 @@ export default function({ getService }: FtrProviderContext) { modelSizeStats: { result_type: 'model_size_stats', model_bytes_exceeded: '0.0 B', - model_bytes_memory_limit: '100.0 MB', total_by_field_count: '994', total_over_field_count: '0', total_partition_field_count: '2', @@ -549,7 +547,6 @@ export default function({ getService }: FtrProviderContext) { job_id: testData.jobId, result_type: testData.expected.modelSizeStats.result_type, model_bytes_exceeded: testData.expected.modelSizeStats.model_bytes_exceeded, - model_bytes_memory_limit: testData.expected.modelSizeStats.model_bytes_memory_limit, total_by_field_count: testData.expected.modelSizeStats.total_by_field_count, total_over_field_count: testData.expected.modelSizeStats.total_over_field_count, total_partition_field_count: @@ -813,7 +810,6 @@ export default function({ getService }: FtrProviderContext) { job_id: testData.jobIdClone, result_type: testData.expected.modelSizeStats.result_type, model_bytes_exceeded: testData.expected.modelSizeStats.model_bytes_exceeded, - model_bytes_memory_limit: testData.expected.modelSizeStats.model_bytes_memory_limit, total_by_field_count: testData.expected.modelSizeStats.total_by_field_count, total_over_field_count: testData.expected.modelSizeStats.total_over_field_count, total_partition_field_count: diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/categorization_job.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/categorization_job.ts index 5a39b06b4c15a..b8ac646c35875 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/categorization_job.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/categorization_job.ts @@ -64,7 +64,6 @@ export default function({ getService }: FtrProviderContext) { job_id: expectedJobId, result_type: 'model_size_stats', model_bytes_exceeded: '0.0 B', - model_bytes_memory_limit: '15.0 MB', total_by_field_count: '30', total_over_field_count: '0', total_partition_field_count: '2', diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/date_nanos_job.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/date_nanos_job.ts index 96b69c10f4c2f..d3934d674124e 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/date_nanos_job.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/date_nanos_job.ts @@ -153,7 +153,6 @@ export default function({ getService }: FtrProviderContext) { modelSizeStats: { result_type: 'model_size_stats', model_bytes_exceeded: '0.0 B', - model_bytes_memory_limit: '10.0 MB', total_by_field_count: '3', total_over_field_count: '0', total_partition_field_count: '2', @@ -422,7 +421,6 @@ export default function({ getService }: FtrProviderContext) { job_id: testData.jobId, result_type: testData.expected.modelSizeStats.result_type, model_bytes_exceeded: testData.expected.modelSizeStats.model_bytes_exceeded, - model_bytes_memory_limit: testData.expected.modelSizeStats.model_bytes_memory_limit, total_by_field_count: testData.expected.modelSizeStats.total_by_field_count, total_over_field_count: testData.expected.modelSizeStats.total_over_field_count, total_partition_field_count: diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/multi_metric_job.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/multi_metric_job.ts index 45b03b3d179b7..f6a9c96492f39 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/multi_metric_job.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/multi_metric_job.ts @@ -61,7 +61,6 @@ export default function({ getService }: FtrProviderContext) { job_id: expectedJobId, result_type: 'model_size_stats', model_bytes_exceeded: '0.0 B', - model_bytes_memory_limit: '20.0 MB', total_by_field_count: '59', total_over_field_count: '0', total_partition_field_count: '58', diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/population_job.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/population_job.ts index a9c94a650898e..547c489411b5f 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/population_job.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/population_job.ts @@ -75,7 +75,6 @@ export default function({ getService }: FtrProviderContext) { job_id: expectedJobId, result_type: 'model_size_stats', model_bytes_exceeded: '0.0 B', - model_bytes_memory_limit: '8.0 MB', total_by_field_count: '25', total_over_field_count: '92', total_partition_field_count: '3', diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/saved_search_job.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/saved_search_job.ts index 862904862cb13..b1fee1633641a 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/saved_search_job.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/saved_search_job.ts @@ -54,7 +54,6 @@ export default function({ getService }: FtrProviderContext) { modelSizeStats: { result_type: 'model_size_stats', model_bytes_exceeded: '0.0 B', - model_bytes_memory_limit: '20.0 MB', total_by_field_count: '3', total_over_field_count: '0', total_partition_field_count: '2', @@ -105,7 +104,6 @@ export default function({ getService }: FtrProviderContext) { modelSizeStats: { result_type: 'model_size_stats', model_bytes_exceeded: '0.0 B', - model_bytes_memory_limit: '20.0 MB', total_by_field_count: '7', total_over_field_count: '0', total_partition_field_count: '6', @@ -156,7 +154,6 @@ export default function({ getService }: FtrProviderContext) { modelSizeStats: { result_type: 'model_size_stats', model_bytes_exceeded: '0.0 B', - model_bytes_memory_limit: '20.0 MB', total_by_field_count: '7', total_over_field_count: '0', total_partition_field_count: '6', @@ -208,7 +205,6 @@ export default function({ getService }: FtrProviderContext) { modelSizeStats: { result_type: 'model_size_stats', model_bytes_exceeded: '0.0 B', - model_bytes_memory_limit: '20.0 MB', total_by_field_count: '3', total_over_field_count: '0', total_partition_field_count: '2', @@ -259,7 +255,6 @@ export default function({ getService }: FtrProviderContext) { modelSizeStats: { result_type: 'model_size_stats', model_bytes_exceeded: '0.0 B', - model_bytes_memory_limit: '20.0 MB', total_by_field_count: '3', total_over_field_count: '0', total_partition_field_count: '2', @@ -464,7 +459,6 @@ export default function({ getService }: FtrProviderContext) { job_id: testData.jobId, result_type: testData.expected.modelSizeStats.result_type, model_bytes_exceeded: testData.expected.modelSizeStats.model_bytes_exceeded, - model_bytes_memory_limit: testData.expected.modelSizeStats.model_bytes_memory_limit, total_by_field_count: testData.expected.modelSizeStats.total_by_field_count, total_over_field_count: testData.expected.modelSizeStats.total_over_field_count, total_partition_field_count: diff --git a/x-pack/test/functional/apps/machine_learning/anomaly_detection/single_metric_job.ts b/x-pack/test/functional/apps/machine_learning/anomaly_detection/single_metric_job.ts index 46fbc40139485..0f8655e3c6bbc 100644 --- a/x-pack/test/functional/apps/machine_learning/anomaly_detection/single_metric_job.ts +++ b/x-pack/test/functional/apps/machine_learning/anomaly_detection/single_metric_job.ts @@ -60,7 +60,6 @@ export default function({ getService }: FtrProviderContext) { job_id: expectedJobId, result_type: 'model_size_stats', model_bytes_exceeded: '0.0 B', - model_bytes_memory_limit: '15.0 MB', total_by_field_count: '3', total_over_field_count: '0', total_partition_field_count: '2', diff --git a/x-pack/test/functional/apps/machine_learning/pages.ts b/x-pack/test/functional/apps/machine_learning/pages.ts index 3c3698792ff7d..35536b4eeda12 100644 --- a/x-pack/test/functional/apps/machine_learning/pages.ts +++ b/x-pack/test/functional/apps/machine_learning/pages.ts @@ -10,7 +10,7 @@ export default function({ getService }: FtrProviderContext) { const ml = getService('ml'); describe('page navigation', function() { - this.tags(['includeFirefox', 'mlqa']); + this.tags(['skipFirefox', 'mlqa']); before(async () => { await ml.api.cleanMlIndices(); await ml.securityUI.loginAsMlPowerUser(); diff --git a/x-pack/test/functional/services/machine_learning/job_table.ts b/x-pack/test/functional/services/machine_learning/job_table.ts index 0e638963f2367..e2451328ea941 100644 --- a/x-pack/test/functional/services/machine_learning/job_table.ts +++ b/x-pack/test/functional/services/machine_learning/job_table.ts @@ -187,44 +187,24 @@ export function MachineLearningJobTableProvider({ getService }: FtrProviderConte expectedCounts: object, expectedModelSizeStats: object ) { - const countDetails = await this.parseJobCounts(jobId); - const counts = countDetails.counts; - - // fields that have changing values are only validated - // to be present and then removed so they don't make - // the object validation fail - expect(counts).to.have.property('last_data_time'); - delete counts.last_data_time; - - expect(counts).to.eql(expectedCounts); - - const modelSizeStats = countDetails.modelSizeStats; - - // fields that have changing values are only validated - // to be present and then removed so they don't make - // the object validation fail - expect(modelSizeStats).to.have.property('log_time'); - delete modelSizeStats.log_time; - expect(modelSizeStats).to.have.property('model_bytes'); - delete modelSizeStats.model_bytes; - - // remove categorization fields from validation until - // the ES version is updated - delete modelSizeStats.categorization_status; - delete modelSizeStats.categorized_doc_count; - delete modelSizeStats.dead_category_count; - delete modelSizeStats.frequent_category_count; - delete modelSizeStats.rare_category_count; - delete modelSizeStats.total_category_count; - - // MML during clone has changed in #61589 - // TODO: adjust test code to reflect the new behavior - expect(modelSizeStats).to.have.property('model_bytes_memory_limit'); - delete modelSizeStats.model_bytes_memory_limit; - // @ts-ignore - delete expectedModelSizeStats.model_bytes_memory_limit; - - expect(modelSizeStats).to.eql(expectedModelSizeStats); + const { counts, modelSizeStats } = await this.parseJobCounts(jobId); + + // Only check for expected keys / values, ignore additional properties + // This way the tests stay stable when new properties are added on the ES side + for (const [key, value] of Object.entries(expectedCounts)) { + expect(counts) + .to.have.property(key) + .eql(value, `Expected counts property '${key}' to exist with value '${value}'`); + } + + for (const [key, value] of Object.entries(expectedModelSizeStats)) { + expect(modelSizeStats) + .to.have.property(key) + .eql( + value, + `Expected model size stats property '${key}' to exist with value '${value}')` + ); + } } public async clickActionsMenu(jobId: string) {