feat(logs/actions): Add getConfig action (#1027)
feat(logs/actions): Add getConfig action Adds getConfig and cleans up log importspull/10616/head
parent
03236c2d95
commit
9a65938e1d
|
@ -1,13 +1,30 @@
|
||||||
import {Namespace} from 'src/types'
|
// Utils
|
||||||
import {Source} from 'src/types/v2'
|
|
||||||
import {getSource} from 'src/sources/apis/v2'
|
|
||||||
import {getDeep} from 'src/utils/wrappers'
|
import {getDeep} from 'src/utils/wrappers'
|
||||||
|
import {serverToUIConfig} from 'src/logs/utils/config'
|
||||||
import AJAX from 'src/utils/ajax'
|
import AJAX from 'src/utils/ajax'
|
||||||
|
|
||||||
import {Filter, LogConfig, SearchStatus} from 'src/types/logs'
|
// APIs
|
||||||
|
import {readViews as readViewsAJAX} from 'src/dashboards/apis/v2/view'
|
||||||
|
import {getSource} from 'src/sources/apis/v2'
|
||||||
|
|
||||||
|
// Data
|
||||||
|
import {logViewData as defaultLogView} from 'src/logs/data/logViewData'
|
||||||
|
|
||||||
|
// Types
|
||||||
|
import {Dispatch} from 'redux'
|
||||||
|
import {View, ViewType} from 'src/types/v2/dashboards'
|
||||||
|
import {Filter, LogConfig, SearchStatus, LogsState} from 'src/types/logs'
|
||||||
|
import {Namespace} from 'src/types'
|
||||||
|
import {Source} from 'src/types/v2'
|
||||||
|
|
||||||
export const INITIAL_LIMIT = 1000
|
export const INITIAL_LIMIT = 1000
|
||||||
|
|
||||||
|
interface State {
|
||||||
|
logs: LogsState
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetState = () => State
|
||||||
|
|
||||||
export enum ActionTypes {
|
export enum ActionTypes {
|
||||||
SetSource = 'LOGS_SET_SOURCE',
|
SetSource = 'LOGS_SET_SOURCE',
|
||||||
SetNamespaces = 'LOGS_SET_NAMESPACES',
|
SetNamespaces = 'LOGS_SET_NAMESPACES',
|
||||||
|
@ -20,6 +37,9 @@ export enum ActionTypes {
|
||||||
SetSearchStatus = 'SET_SEARCH_STATUS',
|
SetSearchStatus = 'SET_SEARCH_STATUS',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const getIsTruncated = (state: State): boolean =>
|
||||||
|
state.logs.logConfig.isTruncated
|
||||||
|
|
||||||
export interface AddFilterAction {
|
export interface AddFilterAction {
|
||||||
type: ActionTypes.AddFilter
|
type: ActionTypes.AddFilter
|
||||||
payload: {
|
payload: {
|
||||||
|
@ -194,6 +214,23 @@ export const getSourceAndPopulateNamespacesAsync = (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const getLogConfigAsync = (url: string) => async (
|
||||||
|
dispatch: Dispatch<SetConfigAction>,
|
||||||
|
getState: GetState
|
||||||
|
) => {
|
||||||
|
const state = getState()
|
||||||
|
const isTruncated = getIsTruncated(state)
|
||||||
|
const views = await readViewsAJAX(url, {type: ViewType.LogViewer})
|
||||||
|
const logView: View = getDeep(views, '0', defaultLogView)
|
||||||
|
|
||||||
|
const logConfig = {
|
||||||
|
...serverToUIConfig(logView),
|
||||||
|
isTruncated,
|
||||||
|
}
|
||||||
|
|
||||||
|
await dispatch(setConfig(logConfig))
|
||||||
|
}
|
||||||
|
|
||||||
export const setConfig = (logConfig: LogConfig): SetConfigAction => {
|
export const setConfig = (logConfig: LogConfig): SetConfigAction => {
|
||||||
return {
|
return {
|
||||||
type: ActionTypes.SetConfig,
|
type: ActionTypes.SetConfig,
|
||||||
|
|
|
@ -1,52 +1,61 @@
|
||||||
|
// Libraries
|
||||||
import React, {Component} from 'react'
|
import React, {Component} from 'react'
|
||||||
import {connect} from 'react-redux'
|
import {connect} from 'react-redux'
|
||||||
import {withRouter, InjectedRouter} from 'react-router'
|
import {withRouter, InjectedRouter} from 'react-router'
|
||||||
|
|
||||||
import {searchToFilters} from 'src/logs/utils/search'
|
// Components
|
||||||
import {notify as notifyAction} from 'src/shared/actions/notifications'
|
|
||||||
|
|
||||||
import {NOW} from 'src/logs/constants'
|
|
||||||
|
|
||||||
import {
|
|
||||||
getSourceAndPopulateNamespacesAsync,
|
|
||||||
setNamespaceAsync,
|
|
||||||
addFilter,
|
|
||||||
removeFilter,
|
|
||||||
changeFilter,
|
|
||||||
clearFilters,
|
|
||||||
setSearchStatus,
|
|
||||||
setConfig,
|
|
||||||
} from 'src/logs/actions'
|
|
||||||
import {getSourcesAsync} from 'src/shared/actions/sources'
|
|
||||||
import LogsHeader from 'src/logs/components/LogsHeader'
|
import LogsHeader from 'src/logs/components/LogsHeader'
|
||||||
import LoadingStatus from 'src/logs/components/loading_status/LoadingStatus'
|
import LoadingStatus from 'src/logs/components/loading_status/LoadingStatus'
|
||||||
import SearchBar from 'src/logs/components/LogsSearchBar'
|
import SearchBar from 'src/logs/components/LogsSearchBar'
|
||||||
import FilterBar from 'src/logs/components/logs_filter_bar/LogsFilterBar'
|
import FilterBar from 'src/logs/components/logs_filter_bar/LogsFilterBar'
|
||||||
import {Source} from 'src/types/v2'
|
|
||||||
import {Namespace} from 'src/types'
|
|
||||||
|
|
||||||
|
// Actions
|
||||||
|
import * as logActions from 'src/logs/actions'
|
||||||
|
import {getSourcesAsync} from 'src/shared/actions/sources'
|
||||||
|
import {notify as notifyAction} from 'src/shared/actions/notifications'
|
||||||
|
|
||||||
|
// Utils
|
||||||
|
import {searchToFilters} from 'src/logs/utils/search'
|
||||||
|
|
||||||
|
// Constants
|
||||||
|
import {NOW} from 'src/logs/constants'
|
||||||
|
|
||||||
|
// Types
|
||||||
|
import {Source, Links} from 'src/types/v2'
|
||||||
|
import {Namespace} from 'src/types'
|
||||||
import {Filter, LogConfig, SearchStatus} from 'src/types/logs'
|
import {Filter, LogConfig, SearchStatus} from 'src/types/logs'
|
||||||
|
|
||||||
interface Props {
|
interface StateProps {
|
||||||
|
links: Links
|
||||||
sources: Source[]
|
sources: Source[]
|
||||||
currentSource: Source | null
|
|
||||||
currentNamespaces: Namespace[]
|
|
||||||
currentNamespace: Namespace
|
|
||||||
getSourceAndPopulateNamespaces: typeof getSourceAndPopulateNamespacesAsync
|
|
||||||
getSources: () => void
|
|
||||||
setNamespaceAsync: (namespace: Namespace) => void
|
|
||||||
addFilter: (filter: Filter) => void
|
|
||||||
removeFilter: (id: string) => void
|
|
||||||
changeFilter: (id: string, operator: string, value: string) => void
|
|
||||||
clearFilters: () => void
|
|
||||||
updateConfig: typeof setConfig
|
|
||||||
router: InjectedRouter
|
|
||||||
filters: Filter[]
|
filters: Filter[]
|
||||||
logConfig: LogConfig
|
logConfig: LogConfig
|
||||||
searchStatus: SearchStatus
|
searchStatus: SearchStatus
|
||||||
setSearchStatus: typeof setSearchStatus
|
currentNamespace: Namespace
|
||||||
|
currentSource: Source | null
|
||||||
|
currentNamespaces: Namespace[]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface PassedProps {
|
||||||
|
router: InjectedRouter
|
||||||
|
}
|
||||||
|
|
||||||
|
interface DispatchProps {
|
||||||
|
notify: typeof notifyAction
|
||||||
|
getConfig: typeof logActions.getLogConfigAsync
|
||||||
|
getSources: typeof getSourcesAsync
|
||||||
|
addFilter: typeof logActions.addFilter
|
||||||
|
updateConfig: typeof logActions.setConfig
|
||||||
|
removeFilter: typeof logActions.removeFilter
|
||||||
|
changeFilter: typeof logActions.changeFilter
|
||||||
|
clearFilters: typeof logActions.clearFilters
|
||||||
|
setSearchStatus: typeof logActions.setSearchStatus
|
||||||
|
setNamespaceAsync: typeof logActions.setNamespaceAsync
|
||||||
|
getSourceAndPopulateNamespaces: typeof logActions.getSourceAndPopulateNamespacesAsync
|
||||||
|
}
|
||||||
|
|
||||||
|
type Props = StateProps & PassedProps & DispatchProps
|
||||||
|
|
||||||
interface State {
|
interface State {
|
||||||
liveUpdating: boolean
|
liveUpdating: boolean
|
||||||
}
|
}
|
||||||
|
@ -70,9 +79,14 @@ class LogsPage extends Component<Props, State> {
|
||||||
}
|
}
|
||||||
|
|
||||||
public async componentDidMount() {
|
public async componentDidMount() {
|
||||||
|
const {
|
||||||
|
links: {views: viewsLink},
|
||||||
|
} = this.props
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await this.props.getSources()
|
await this.props.getSources()
|
||||||
await this.setCurrentSource()
|
await this.setCurrentSource()
|
||||||
|
await this.props.getConfig(viewsLink)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Failed to get sources and namespaces for logs')
|
console.error('Failed to get sources and namespaces for logs')
|
||||||
}
|
}
|
||||||
|
@ -248,6 +262,7 @@ class LogsPage extends Component<Props, State> {
|
||||||
|
|
||||||
const mapStateToProps = ({
|
const mapStateToProps = ({
|
||||||
sources,
|
sources,
|
||||||
|
links,
|
||||||
logs: {
|
logs: {
|
||||||
currentSource,
|
currentSource,
|
||||||
currentNamespaces,
|
currentNamespaces,
|
||||||
|
@ -256,27 +271,30 @@ const mapStateToProps = ({
|
||||||
logConfig,
|
logConfig,
|
||||||
searchStatus,
|
searchStatus,
|
||||||
},
|
},
|
||||||
}) => ({
|
}): StateProps => ({
|
||||||
|
links,
|
||||||
sources,
|
sources,
|
||||||
currentSource,
|
|
||||||
currentNamespaces,
|
|
||||||
currentNamespace,
|
|
||||||
filters,
|
filters,
|
||||||
logConfig,
|
logConfig,
|
||||||
searchStatus,
|
searchStatus,
|
||||||
|
currentSource,
|
||||||
|
currentNamespace,
|
||||||
|
currentNamespaces,
|
||||||
})
|
})
|
||||||
|
|
||||||
const mapDispatchToProps = {
|
const mapDispatchToProps: DispatchProps = {
|
||||||
getSourceAndPopulateNamespaces: getSourceAndPopulateNamespacesAsync,
|
|
||||||
getSources: getSourcesAsync,
|
|
||||||
setNamespaceAsync,
|
|
||||||
setSearchStatus,
|
|
||||||
addFilter,
|
|
||||||
removeFilter,
|
|
||||||
changeFilter,
|
|
||||||
clearFilters,
|
|
||||||
updateConfig: setConfig,
|
|
||||||
notify: notifyAction,
|
notify: notifyAction,
|
||||||
|
getSources: getSourcesAsync,
|
||||||
|
addFilter: logActions.addFilter,
|
||||||
|
updateConfig: logActions.setConfig,
|
||||||
|
removeFilter: logActions.removeFilter,
|
||||||
|
changeFilter: logActions.changeFilter,
|
||||||
|
clearFilters: logActions.clearFilters,
|
||||||
|
getConfig: logActions.getLogConfigAsync,
|
||||||
|
setSearchStatus: logActions.setSearchStatus,
|
||||||
|
setNamespaceAsync: logActions.setNamespaceAsync,
|
||||||
|
getSourceAndPopulateNamespaces:
|
||||||
|
logActions.getSourceAndPopulateNamespacesAsync,
|
||||||
}
|
}
|
||||||
|
|
||||||
export default withRouter(
|
export default withRouter(
|
||||||
|
|
Loading…
Reference in New Issue