feat(ui): remove hipchat
parent
c7a2c1d05b
commit
698e64538a
|
@ -21,7 +21,6 @@ import {
|
||||||
|
|
||||||
import {
|
import {
|
||||||
AlertaConfig,
|
AlertaConfig,
|
||||||
HipChatConfig,
|
|
||||||
OpsGenieConfig,
|
OpsGenieConfig,
|
||||||
PagerDutyConfig,
|
PagerDutyConfig,
|
||||||
PagerDuty2Config,
|
PagerDuty2Config,
|
||||||
|
@ -77,7 +76,6 @@ interface Section {
|
||||||
|
|
||||||
interface Sections {
|
interface Sections {
|
||||||
alerta: Section
|
alerta: Section
|
||||||
hipchat: Section
|
|
||||||
httppost: Section
|
httppost: Section
|
||||||
influxdb: Section
|
influxdb: Section
|
||||||
kafka: Section
|
kafka: Section
|
||||||
|
@ -234,15 +232,6 @@ class AlertTabs extends PureComponent<Props, State> {
|
||||||
enabled={this.getConfigEnabled(configSections, AlertTypes.alerta)}
|
enabled={this.getConfigEnabled(configSections, AlertTypes.alerta)}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
case AlertTypes.hipchat:
|
|
||||||
return (
|
|
||||||
<HipChatConfig
|
|
||||||
onSave={this.handleSaveConfig(AlertTypes.hipchat)}
|
|
||||||
config={this.getSectionElement(configSections, AlertTypes.hipchat)}
|
|
||||||
onTest={this.handleTestConfig(AlertTypes.hipchat)}
|
|
||||||
enabled={this.getConfigEnabled(configSections, AlertTypes.hipchat)}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
case AlertTypes.kafka:
|
case AlertTypes.kafka:
|
||||||
return (
|
return (
|
||||||
<KafkaConfigs
|
<KafkaConfigs
|
||||||
|
|
|
@ -7,7 +7,6 @@ import {
|
||||||
LogHandler,
|
LogHandler,
|
||||||
EmailHandler,
|
EmailHandler,
|
||||||
AlertaHandler,
|
AlertaHandler,
|
||||||
HipchatHandler,
|
|
||||||
KafkaHandler,
|
KafkaHandler,
|
||||||
OpsgenieHandler,
|
OpsgenieHandler,
|
||||||
PagerdutyHandler,
|
PagerdutyHandler,
|
||||||
|
@ -85,15 +84,6 @@ class HandlerOptions extends Component {
|
||||||
validationError={validationError}
|
validationError={validationError}
|
||||||
/>
|
/>
|
||||||
)
|
)
|
||||||
case 'hipChat':
|
|
||||||
return (
|
|
||||||
<HipchatHandler
|
|
||||||
selectedHandler={selectedHandler}
|
|
||||||
handleModifyHandler={handleModifyHandler}
|
|
||||||
onGoToConfig={onGoToConfig('hipchat')}
|
|
||||||
validationError={validationError}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
case 'kafka':
|
case 'kafka':
|
||||||
return (
|
return (
|
||||||
<KafkaHandler
|
<KafkaHandler
|
||||||
|
|
|
@ -32,7 +32,6 @@ interface Props {
|
||||||
|
|
||||||
interface HandlerKind {
|
interface HandlerKind {
|
||||||
alerta?: number
|
alerta?: number
|
||||||
hipchat?: number
|
|
||||||
httppost?: number
|
httppost?: number
|
||||||
influxdb?: number
|
influxdb?: number
|
||||||
kafka?: number
|
kafka?: number
|
||||||
|
|
|
@ -1,159 +0,0 @@
|
||||||
import _ from 'lodash'
|
|
||||||
import React, {PureComponent, ChangeEvent} from 'react'
|
|
||||||
|
|
||||||
import QuestionMarkTooltip from 'src/shared/components/QuestionMarkTooltip'
|
|
||||||
import {HIPCHAT_TOKEN_TIP} from 'src/kapacitor/copy'
|
|
||||||
import RedactedInput from 'src/kapacitor/components/config/RedactedInput'
|
|
||||||
import {ErrorHandling} from 'src/shared/decorators/errors'
|
|
||||||
|
|
||||||
import {HipChatProperties} from 'src/types/kapacitor'
|
|
||||||
|
|
||||||
interface Config {
|
|
||||||
options: {
|
|
||||||
room: string
|
|
||||||
token: boolean
|
|
||||||
url: string
|
|
||||||
enabled: boolean
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface Props {
|
|
||||||
config: Config
|
|
||||||
onSave: (properties: HipChatProperties) => Promise<boolean>
|
|
||||||
onTest: (event: React.MouseEvent<HTMLButtonElement>) => void
|
|
||||||
enabled: boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
interface State {
|
|
||||||
testEnabled: boolean
|
|
||||||
enabled: boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
@ErrorHandling
|
|
||||||
class HipchatConfig extends PureComponent<Props, State> {
|
|
||||||
private room: HTMLInputElement
|
|
||||||
private token: HTMLInputElement
|
|
||||||
private url: HTMLInputElement
|
|
||||||
|
|
||||||
constructor(props) {
|
|
||||||
super(props)
|
|
||||||
this.state = {
|
|
||||||
testEnabled: this.props.enabled,
|
|
||||||
enabled: _.get(this.props, 'config.options.enabled', false),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public render() {
|
|
||||||
const {options} = this.props.config
|
|
||||||
const {url, room, token} = options
|
|
||||||
const {testEnabled, enabled} = this.state
|
|
||||||
|
|
||||||
const subdomain = url
|
|
||||||
.replace('https://', '')
|
|
||||||
.replace('.hipchat.com/v2/room', '')
|
|
||||||
|
|
||||||
return (
|
|
||||||
<form onSubmit={this.handleSubmit}>
|
|
||||||
<div className="form-group col-xs-12">
|
|
||||||
<label htmlFor="url">Subdomain</label>
|
|
||||||
<input
|
|
||||||
className="form-control"
|
|
||||||
id="url"
|
|
||||||
type="text"
|
|
||||||
placeholder="your-subdomain"
|
|
||||||
ref={r => (this.url = r)}
|
|
||||||
defaultValue={subdomain && subdomain.length ? subdomain : ''}
|
|
||||||
onChange={this.disableTest}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="form-group col-xs-12">
|
|
||||||
<label htmlFor="room">Room</label>
|
|
||||||
<input
|
|
||||||
className="form-control"
|
|
||||||
id="room"
|
|
||||||
type="text"
|
|
||||||
placeholder="your-hipchat-room"
|
|
||||||
ref={r => (this.room = r)}
|
|
||||||
defaultValue={room || ''}
|
|
||||||
onChange={this.disableTest}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="form-group col-xs-12">
|
|
||||||
<label htmlFor="token">
|
|
||||||
Token
|
|
||||||
<QuestionMarkTooltip tipID="token" tipContent={HIPCHAT_TOKEN_TIP} />
|
|
||||||
</label>
|
|
||||||
<RedactedInput
|
|
||||||
defaultValue={token}
|
|
||||||
id="token"
|
|
||||||
refFunc={this.handleTokenRef}
|
|
||||||
disableTest={this.disableTest}
|
|
||||||
isFormEditing={!testEnabled}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="form-group col-xs-12">
|
|
||||||
<div className="form-control-static">
|
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
id="disabled"
|
|
||||||
checked={enabled}
|
|
||||||
onChange={this.handleEnabledChange}
|
|
||||||
/>
|
|
||||||
<label htmlFor="disabled">Configuration Enabled</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="form-group form-group-submit col-xs-12 text-center">
|
|
||||||
<button
|
|
||||||
className="btn btn-primary"
|
|
||||||
type="submit"
|
|
||||||
disabled={this.state.testEnabled}
|
|
||||||
>
|
|
||||||
<span className="icon checkmark" />
|
|
||||||
Save Changes
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
className="btn btn-primary"
|
|
||||||
disabled={!this.state.testEnabled || !enabled}
|
|
||||||
onClick={this.props.onTest}
|
|
||||||
>
|
|
||||||
<span className="icon pulse-c" />
|
|
||||||
Send Test Alert
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private handleEnabledChange = (e: ChangeEvent<HTMLInputElement>) => {
|
|
||||||
this.setState({enabled: e.target.checked})
|
|
||||||
this.disableTest()
|
|
||||||
}
|
|
||||||
|
|
||||||
private handleSubmit = async e => {
|
|
||||||
e.preventDefault()
|
|
||||||
|
|
||||||
const properties: HipChatProperties = {
|
|
||||||
room: this.room.value,
|
|
||||||
url: `https://${this.url.value}.hipchat.com/v2/room`,
|
|
||||||
token: this.token.value,
|
|
||||||
enabled: this.state.enabled,
|
|
||||||
}
|
|
||||||
|
|
||||||
const success = await this.props.onSave(properties)
|
|
||||||
if (success) {
|
|
||||||
this.setState({testEnabled: true})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private disableTest = () => {
|
|
||||||
this.setState({testEnabled: false})
|
|
||||||
}
|
|
||||||
|
|
||||||
private handleTokenRef = r => (this.token = r)
|
|
||||||
}
|
|
||||||
|
|
||||||
export default HipchatConfig
|
|
|
@ -1,5 +1,4 @@
|
||||||
import AlertaConfig from './AlertaConfig'
|
import AlertaConfig from './AlertaConfig'
|
||||||
import HipChatConfig from './HipChatConfig'
|
|
||||||
import KafkaConfig from './KafkaConfig'
|
import KafkaConfig from './KafkaConfig'
|
||||||
import OpsGenieConfig from './OpsGenieConfig'
|
import OpsGenieConfig from './OpsGenieConfig'
|
||||||
import PagerDutyConfig from './PagerDutyConfig'
|
import PagerDutyConfig from './PagerDutyConfig'
|
||||||
|
@ -17,7 +16,6 @@ import ServiceNowConfig from './ServiceNowConfig'
|
||||||
|
|
||||||
export {
|
export {
|
||||||
AlertaConfig,
|
AlertaConfig,
|
||||||
HipChatConfig,
|
|
||||||
KafkaConfig,
|
KafkaConfig,
|
||||||
OpsGenieConfig,
|
OpsGenieConfig,
|
||||||
PagerDutyConfig,
|
PagerDutyConfig,
|
||||||
|
|
|
@ -1,69 +0,0 @@
|
||||||
import React from 'react'
|
|
||||||
import PropTypes from 'prop-types'
|
|
||||||
import HandlerInput from 'src/kapacitor/components/HandlerInput'
|
|
||||||
import HandlerEmpty from 'src/kapacitor/components/HandlerEmpty'
|
|
||||||
|
|
||||||
const HipchatHandler = ({
|
|
||||||
selectedHandler,
|
|
||||||
handleModifyHandler,
|
|
||||||
onGoToConfig,
|
|
||||||
validationError,
|
|
||||||
}) =>
|
|
||||||
selectedHandler.enabled ? (
|
|
||||||
<div className="endpoint-tab-contents">
|
|
||||||
<div className="endpoint-tab--parameters">
|
|
||||||
<h4 className="u-flex u-jc-space-between">
|
|
||||||
Parameters from Kapacitor Configuration
|
|
||||||
<div className="btn btn-default btn-sm" onClick={onGoToConfig}>
|
|
||||||
<span className="icon cog-thick" />
|
|
||||||
{validationError
|
|
||||||
? 'Exit this Rule and Edit Configuration'
|
|
||||||
: 'Save this Rule and Edit Configuration'}
|
|
||||||
</div>
|
|
||||||
</h4>
|
|
||||||
<div className="faux-form">
|
|
||||||
<HandlerInput
|
|
||||||
selectedHandler={selectedHandler}
|
|
||||||
handleModifyHandler={handleModifyHandler}
|
|
||||||
fieldName="token"
|
|
||||||
fieldDisplay="Token:"
|
|
||||||
placeholder="ex: the_token"
|
|
||||||
redacted={true}
|
|
||||||
fieldColumns="col-md-12"
|
|
||||||
/>
|
|
||||||
<HandlerInput
|
|
||||||
selectedHandler={selectedHandler}
|
|
||||||
handleModifyHandler={handleModifyHandler}
|
|
||||||
fieldName="url"
|
|
||||||
fieldDisplay="Subdomain Url"
|
|
||||||
placeholder="ex: hipchat_subdomain"
|
|
||||||
disabled={true}
|
|
||||||
/>
|
|
||||||
<HandlerInput
|
|
||||||
selectedHandler={selectedHandler}
|
|
||||||
handleModifyHandler={handleModifyHandler}
|
|
||||||
fieldName="room"
|
|
||||||
fieldDisplay="Room:"
|
|
||||||
placeholder="ex: room_name"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
<HandlerEmpty
|
|
||||||
onGoToConfig={onGoToConfig}
|
|
||||||
validationError={validationError}
|
|
||||||
/>
|
|
||||||
)
|
|
||||||
|
|
||||||
const {func, shape, string} = PropTypes
|
|
||||||
|
|
||||||
HipchatHandler.propTypes = {
|
|
||||||
selectedHandler: shape({}).isRequired,
|
|
||||||
handleModifyHandler: func.isRequired,
|
|
||||||
|
|
||||||
onGoToConfig: func.isRequired,
|
|
||||||
validationError: string.isRequired,
|
|
||||||
}
|
|
||||||
|
|
||||||
export default HipchatHandler
|
|
|
@ -3,7 +3,6 @@ import TcpHandler from './TcpHandler'
|
||||||
import ExecHandler from './ExecHandler'
|
import ExecHandler from './ExecHandler'
|
||||||
import LogHandler from './LogHandler'
|
import LogHandler from './LogHandler'
|
||||||
import AlertaHandler from './AlertaHandler'
|
import AlertaHandler from './AlertaHandler'
|
||||||
import HipchatHandler from './HipchatHandler'
|
|
||||||
import KafkaHandler from './KafkaHandler'
|
import KafkaHandler from './KafkaHandler'
|
||||||
import OpsgenieHandler from './OpsgenieHandler'
|
import OpsgenieHandler from './OpsgenieHandler'
|
||||||
import PagerdutyHandler from './PagerdutyHandler'
|
import PagerdutyHandler from './PagerdutyHandler'
|
||||||
|
@ -24,7 +23,6 @@ export {
|
||||||
LogHandler,
|
LogHandler,
|
||||||
EmailHandler,
|
EmailHandler,
|
||||||
AlertaHandler,
|
AlertaHandler,
|
||||||
HipchatHandler,
|
|
||||||
KafkaHandler,
|
KafkaHandler,
|
||||||
OpsgenieHandler,
|
OpsgenieHandler,
|
||||||
PagerdutyHandler,
|
PagerdutyHandler,
|
||||||
|
|
|
@ -11,7 +11,6 @@ import {
|
||||||
export enum AlertTypes {
|
export enum AlertTypes {
|
||||||
seperator = '',
|
seperator = '',
|
||||||
alerta = 'alerta',
|
alerta = 'alerta',
|
||||||
hipchat = 'hipchat',
|
|
||||||
httppost = 'httppost',
|
httppost = 'httppost',
|
||||||
influxdb = 'influxdb',
|
influxdb = 'influxdb',
|
||||||
kafka = 'kafka',
|
kafka = 'kafka',
|
||||||
|
@ -37,7 +36,6 @@ export enum AlertTypes {
|
||||||
|
|
||||||
export enum AlertDisplayText {
|
export enum AlertDisplayText {
|
||||||
alerta = 'Alerta',
|
alerta = 'Alerta',
|
||||||
hipchat = 'HipChat',
|
|
||||||
kafka = 'Kafka',
|
kafka = 'Kafka',
|
||||||
opsgenie = 'OpsGenie',
|
opsgenie = 'OpsGenie',
|
||||||
opsgenie2 = 'OpsGenie2',
|
opsgenie2 = 'OpsGenie2',
|
||||||
|
@ -55,7 +53,6 @@ export enum AlertDisplayText {
|
||||||
|
|
||||||
export const SupportedServices: string[] = [
|
export const SupportedServices: string[] = [
|
||||||
'alerta',
|
'alerta',
|
||||||
'hipchat',
|
|
||||||
'kafka',
|
'kafka',
|
||||||
'opsgenie',
|
'opsgenie',
|
||||||
'opsgenie2',
|
'opsgenie2',
|
||||||
|
@ -207,7 +204,6 @@ export const DEFAULT_HANDLERS: Handler[] = [
|
||||||
]
|
]
|
||||||
|
|
||||||
export const MAP_KEYS_FROM_CONFIG: KeyMappings = {
|
export const MAP_KEYS_FROM_CONFIG: KeyMappings = {
|
||||||
hipchat: 'hipChat',
|
|
||||||
opsgenie: 'opsGenie',
|
opsgenie: 'opsGenie',
|
||||||
opsgenie2: 'opsGenie2',
|
opsgenie2: 'opsGenie2',
|
||||||
pagerduty: 'pagerDuty',
|
pagerduty: 'pagerDuty',
|
||||||
|
@ -220,7 +216,6 @@ export const MAP_KEYS_FROM_CONFIG: KeyMappings = {
|
||||||
// ALERTS_FROM_CONFIG the array of fields to accept from Kapacitor Config
|
// ALERTS_FROM_CONFIG the array of fields to accept from Kapacitor Config
|
||||||
export const ALERTS_FROM_CONFIG: FieldsFromConfigAlerts = {
|
export const ALERTS_FROM_CONFIG: FieldsFromConfigAlerts = {
|
||||||
alerta: ['environment', 'origin', 'token'], // token = bool
|
alerta: ['environment', 'origin', 'token'], // token = bool
|
||||||
hipChat: ['url', 'room', 'token'], // token = bool
|
|
||||||
kafka: ['id'],
|
kafka: ['id'],
|
||||||
opsGenie: ['api-key', 'teams', 'recipients'], // api-key = bool
|
opsGenie: ['api-key', 'teams', 'recipients'], // api-key = bool
|
||||||
opsGenie2: ['api-key', 'teams', 'recipients'], // api-key = bool
|
opsGenie2: ['api-key', 'teams', 'recipients'], // api-key = bool
|
||||||
|
@ -247,7 +242,6 @@ export const ALERTS_FROM_CONFIG: FieldsFromConfigAlerts = {
|
||||||
|
|
||||||
export const MAP_FIELD_KEYS_FROM_CONFIG: ConfigKeyMaps = {
|
export const MAP_FIELD_KEYS_FROM_CONFIG: ConfigKeyMaps = {
|
||||||
alerta: {},
|
alerta: {},
|
||||||
hipChat: {},
|
|
||||||
opsGenie: {},
|
opsGenie: {},
|
||||||
opsGenie2: {},
|
opsGenie2: {},
|
||||||
pagerDuty: {'service-key': 'serviceKey'},
|
pagerDuty: {'service-key': 'serviceKey'},
|
||||||
|
@ -281,7 +275,6 @@ export const HANDLERS_TO_RULE_THEM_ALL: FieldsFromAllAlerts = {
|
||||||
'origin',
|
'origin',
|
||||||
'service',
|
'service',
|
||||||
],
|
],
|
||||||
hipChat: ['room'],
|
|
||||||
kafka: ['id', 'cluster', 'kafka-topic', 'template'],
|
kafka: ['id', 'cluster', 'kafka-topic', 'template'],
|
||||||
opsGenie: ['teams', 'recipients'],
|
opsGenie: ['teams', 'recipients'],
|
||||||
opsGenie2: ['teams', 'recipients'],
|
opsGenie2: ['teams', 'recipients'],
|
||||||
|
|
|
@ -1,8 +1,3 @@
|
||||||
// HipChat
|
|
||||||
const hipchatTokenLink =
|
|
||||||
'https://docs.influxdata.com/kapacitor/latest/guides/event-handler-setup/#hipchat-api-access-token'
|
|
||||||
export const HIPCHAT_TOKEN_TIP = `<p>Need help creating a token?<br/>Check out <a href='${hipchatTokenLink}' target='_blank'>these steps</a>.</p>`
|
|
||||||
|
|
||||||
// Pushover
|
// Pushover
|
||||||
const pushoverDocsLink =
|
const pushoverDocsLink =
|
||||||
'https://docs.influxdata.com/kapacitor/latest/nodes/alert_node/#pushover'
|
'https://docs.influxdata.com/kapacitor/latest/nodes/alert_node/#pushover'
|
||||||
|
|
|
@ -84,7 +84,6 @@ interface AlertNodes {
|
||||||
sensu: Sensu[]
|
sensu: Sensu[]
|
||||||
slack: Slack[]
|
slack: Slack[]
|
||||||
telegram: Telegram[]
|
telegram: Telegram[]
|
||||||
hipChat: HipChat[]
|
|
||||||
alerta: Alerta[]
|
alerta: Alerta[]
|
||||||
opsGenie: OpsGenie[]
|
opsGenie: OpsGenie[]
|
||||||
opsGenie2?: OpsGenie[]
|
opsGenie2?: OpsGenie[]
|
||||||
|
@ -159,12 +158,6 @@ interface PagerDuty2 {
|
||||||
routingKey: string
|
routingKey: string
|
||||||
}
|
}
|
||||||
|
|
||||||
// HipChat sends alerts to stride.com
|
|
||||||
interface HipChat {
|
|
||||||
room: string
|
|
||||||
token: string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sensu sends alerts to sensu or sensuapp.org
|
// Sensu sends alerts to sensu or sensuapp.org
|
||||||
interface Sensu {
|
interface Sensu {
|
||||||
source: string
|
source: string
|
||||||
|
@ -268,7 +261,6 @@ export interface RuleMessage {
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface KeyMappings {
|
export interface KeyMappings {
|
||||||
hipchat: string
|
|
||||||
opsgenie: string
|
opsgenie: string
|
||||||
opsgenie2: string
|
opsgenie2: string
|
||||||
pagerduty: string
|
pagerduty: string
|
||||||
|
@ -280,7 +272,6 @@ export interface KeyMappings {
|
||||||
|
|
||||||
export interface FieldsFromConfigAlerts {
|
export interface FieldsFromConfigAlerts {
|
||||||
alerta: string[]
|
alerta: string[]
|
||||||
hipChat: string[]
|
|
||||||
kafka: string[]
|
kafka: string[]
|
||||||
opsGenie: string[]
|
opsGenie: string[]
|
||||||
opsGenie2: string[]
|
opsGenie2: string[]
|
||||||
|
@ -339,13 +330,6 @@ export interface AlertaProperties {
|
||||||
enabled: boolean
|
enabled: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface HipChatProperties {
|
|
||||||
room: string
|
|
||||||
url: string
|
|
||||||
token: string
|
|
||||||
enabled: boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface KafkaProperties {
|
export interface KafkaProperties {
|
||||||
id?: string
|
id?: string
|
||||||
brokers: string[]
|
brokers: string[]
|
||||||
|
@ -442,7 +426,6 @@ export interface ServiceNowProperties {
|
||||||
|
|
||||||
export type ServiceProperties =
|
export type ServiceProperties =
|
||||||
| AlertaProperties
|
| AlertaProperties
|
||||||
| HipChatProperties
|
|
||||||
| KafkaProperties
|
| KafkaProperties
|
||||||
| OpsGenieProperties
|
| OpsGenieProperties
|
||||||
| PagerDutyProperties
|
| PagerDutyProperties
|
||||||
|
|
|
@ -48,7 +48,7 @@ describe('Kapacitor.Components.TasksTable', () => {
|
||||||
|
|
||||||
describe('checkbox', () => {
|
describe('checkbox', () => {
|
||||||
it('has the correct htmlFor its label', () => {
|
it('has the correct htmlFor its label', () => {
|
||||||
const task = kapacitorRules[3]
|
const task = kapacitorRules[2]
|
||||||
const tasks = [task]
|
const tasks = [task]
|
||||||
const {wrapper} = setup({tasks})
|
const {wrapper} = setup({tasks})
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ describe('Kapacitor.Components.TasksTable', () => {
|
||||||
|
|
||||||
describe('user interaction', () => {
|
describe('user interaction', () => {
|
||||||
it('calls onChangeRuleStatus when checkbox is effectively clicked', () => {
|
it('calls onChangeRuleStatus when checkbox is effectively clicked', () => {
|
||||||
const task = kapacitorRules[3]
|
const task = kapacitorRules[2]
|
||||||
const tasks = [task]
|
const tasks = [task]
|
||||||
const onChangeRuleStatus = jest.fn()
|
const onChangeRuleStatus = jest.fn()
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ describe('Kapacitor.Components.TasksTable', () => {
|
||||||
checkbox.simulate('change')
|
checkbox.simulate('change')
|
||||||
|
|
||||||
expect(onChangeRuleStatus).toHaveBeenCalledTimes(1)
|
expect(onChangeRuleStatus).toHaveBeenCalledTimes(1)
|
||||||
expect(onChangeRuleStatus).toHaveBeenCalledWith(kapacitorRules[3])
|
expect(onChangeRuleStatus).toHaveBeenCalledWith(kapacitorRules[2])
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -191,7 +191,6 @@ export const kapacitorRules = [
|
||||||
],
|
],
|
||||||
slack: [],
|
slack: [],
|
||||||
telegram: [],
|
telegram: [],
|
||||||
hipChat: [],
|
|
||||||
alerta: [],
|
alerta: [],
|
||||||
opsGenie: [],
|
opsGenie: [],
|
||||||
talk: [],
|
talk: [],
|
||||||
|
@ -276,7 +275,6 @@ export const kapacitorRules = [
|
||||||
sensu: [],
|
sensu: [],
|
||||||
slack: [],
|
slack: [],
|
||||||
telegram: [],
|
telegram: [],
|
||||||
hipChat: [],
|
|
||||||
alerta: [
|
alerta: [
|
||||||
{
|
{
|
||||||
token: '',
|
token: '',
|
||||||
|
@ -323,89 +321,11 @@ export const kapacitorRules = [
|
||||||
'/chronograf/v1/sources/1/kapacitors/1/proxy?path=%2Fkapacitor%2Fv1%2Ftasks%2Fchronograf-v1-75b638b0-1530-4163-adab-c9631386e0a2%2Foutput',
|
'/chronograf/v1/sources/1/kapacitors/1/proxy?path=%2Fkapacitor%2Fv1%2Ftasks%2Fchronograf-v1-75b638b0-1530-4163-adab-c9631386e0a2%2Foutput',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
id: 'chronograf-v1-7734918d-b8b6-460d-a416-34767ba76faa',
|
|
||||||
tickscript:
|
|
||||||
"var db = 'telegraf'\n\nvar rp = 'autogen'\n\nvar measurement = 'cpu'\n\nvar groupBy = []\n\nvar whereFilter = lambda: (\"host\" == 'Bobs-MacBook-Pro.local')\n\nvar period = 24h\n\nvar name = 'xena'\n\nvar idVar = name + ':{{.Group}}'\n\nvar message = ''\n\nvar idTag = 'alertID'\n\nvar levelTag = 'level'\n\nvar messageField = 'message'\n\nvar durationField = 'duration'\n\nvar outputDB = 'chronograf'\n\nvar outputRP = 'autogen'\n\nvar outputMeasurement = 'alerts'\n\nvar triggerType = 'deadman'\n\nvar threshold = 0.0\n\nvar data = stream\n |from()\n .database(db)\n .retentionPolicy(rp)\n .measurement(measurement)\n .groupBy(groupBy)\n .where(whereFilter)\n\nvar trigger = data\n |deadman(threshold, period)\n .stateChangesOnly()\n .message(message)\n .id(idVar)\n .idTag(idTag)\n .levelTag(levelTag)\n .messageField(messageField)\n .durationField(durationField)\n .hipChat()\n .room('asdf')\n\ntrigger\n |eval(lambda: \"emitted\")\n .as('value')\n .keep('value', messageField, durationField)\n |eval(lambda: float(\"value\"))\n .as('value')\n .keep()\n |influxDBOut()\n .create()\n .database(outputDB)\n .retentionPolicy(outputRP)\n .measurement(outputMeasurement)\n .tag('alertName', name)\n .tag('triggerType', triggerType)\n\ntrigger\n |httpOut('output')\n",
|
|
||||||
query: {
|
|
||||||
id: 'chronograf-v1-7734918d-b8b6-460d-a416-34767ba76faa',
|
|
||||||
database: 'telegraf',
|
|
||||||
measurement: 'cpu',
|
|
||||||
retentionPolicy: 'autogen',
|
|
||||||
fields: [],
|
|
||||||
tags: {
|
|
||||||
host: ['Bobs-MacBook-Pro.local'],
|
|
||||||
},
|
|
||||||
groupBy: {
|
|
||||||
time: '',
|
|
||||||
tags: [],
|
|
||||||
},
|
|
||||||
areTagsAccepted: true,
|
|
||||||
rawText: null,
|
|
||||||
range: null,
|
|
||||||
shifts: null,
|
|
||||||
},
|
|
||||||
every: '',
|
|
||||||
alertNodes: {
|
|
||||||
typeOf: 'alert',
|
|
||||||
stateChangesOnly: true,
|
|
||||||
useFlapping: false,
|
|
||||||
post: [],
|
|
||||||
tcp: [],
|
|
||||||
email: [],
|
|
||||||
exec: [],
|
|
||||||
log: [],
|
|
||||||
victorOps: [],
|
|
||||||
pagerDuty: [],
|
|
||||||
pushover: [],
|
|
||||||
sensu: [],
|
|
||||||
slack: [],
|
|
||||||
telegram: [],
|
|
||||||
hipChat: [
|
|
||||||
{
|
|
||||||
room: 'asdf',
|
|
||||||
token: '',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
alerta: [],
|
|
||||||
opsGenie: [],
|
|
||||||
talk: [],
|
|
||||||
},
|
|
||||||
message: '',
|
|
||||||
details: '',
|
|
||||||
trigger: 'deadman',
|
|
||||||
values: {
|
|
||||||
period: '24h0m0s',
|
|
||||||
rangeValue: '',
|
|
||||||
},
|
|
||||||
name: 'xena',
|
|
||||||
type: 'stream',
|
|
||||||
dbrps: [
|
|
||||||
{
|
|
||||||
db: 'telegraf',
|
|
||||||
rp: 'autogen',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
status: 'disabled',
|
|
||||||
executing: false,
|
|
||||||
error: '',
|
|
||||||
created: '2018-01-05T15:44:54.657212781-08:00',
|
|
||||||
modified: '2018-03-13T17:17:19.099800735-07:00',
|
|
||||||
'last-enabled': '2018-03-13T17:17:15.964357573-07:00',
|
|
||||||
links: {
|
|
||||||
self:
|
|
||||||
'/chronograf/v1/sources/1/kapacitors/1/rules/chronograf-v1-7734918d-b8b6-460d-a416-34767ba76faa',
|
|
||||||
kapacitor:
|
|
||||||
'/chronograf/v1/sources/1/kapacitors/1/proxy?path=%2Fkapacitor%2Fv1%2Ftasks%2Fchronograf-v1-7734918d-b8b6-460d-a416-34767ba76faa',
|
|
||||||
output:
|
|
||||||
'/chronograf/v1/sources/1/kapacitors/1/proxy?path=%2Fkapacitor%2Fv1%2Ftasks%2Fchronograf-v1-7734918d-b8b6-460d-a416-34767ba76faa%2Foutput',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
// if rule has no `query` key, it will display as a tickscript task only
|
// if rule has no `query` key, it will display as a tickscript task only
|
||||||
id: 'chronograf-v1-7734918d-b8b6-460d-a416-34767ba76aac',
|
id: 'chronograf-v1-7734918d-b8b6-460d-a416-34767ba76aac',
|
||||||
tickscript:
|
tickscript:
|
||||||
"var db = 'telegraf'\n\nvar rp = 'autogen'\n\nvar measurement = 'cpu'\n\nvar groupBy = []\n\nvar whereFilter = lambda: (\"host\" == 'Bobs-MacBook-Pro.local')\n\nvar period = 24h\n\nvar name = 'xena'\n\nvar idVar = name + ':{{.Group}}'\n\nvar message = ''\n\nvar idTag = 'alertID'\n\nvar levelTag = 'level'\n\nvar messageField = 'message'\n\nvar durationField = 'duration'\n\nvar outputDB = 'chronograf'\n\nvar outputRP = 'autogen'\n\nvar outputMeasurement = 'alerts'\n\nvar triggerType = 'deadman'\n\nvar threshold = 0.0\n\nvar data = stream\n |from()\n .database(db)\n .retentionPolicy(rp)\n .measurement(measurement)\n .groupBy(groupBy)\n .where(whereFilter)\n\nvar trigger = data\n |deadman(threshold, period)\n .stateChangesOnly()\n .message(message)\n .id(idVar)\n .idTag(idTag)\n .levelTag(levelTag)\n .messageField(messageField)\n .durationField(durationField)\n .hipChat()\n .room('asdf')\n\ntrigger\n |eval(lambda: \"emitted\")\n .as('value')\n .keep('value', messageField, durationField)\n |eval(lambda: float(\"value\"))\n .as('value')\n .keep()\n |influxDBOut()\n .create()\n .database(outputDB)\n .retentionPolicy(outputRP)\n .measurement(outputMeasurement)\n .tag('alertName', name)\n .tag('triggerType', triggerType)\n\ntrigger\n |httpOut('output')\n",
|
"var db = 'telegraf'\n\nvar rp = 'autogen'\n\nvar measurement = 'cpu'\n\nvar groupBy = []\n\nvar whereFilter = lambda: (\"host\" == 'Bobs-MacBook-Pro.local')\n\nvar period = 24h\n\nvar name = 'xena'\n\nvar idVar = name + ':{{.Group}}'\n\nvar message = ''\n\nvar idTag = 'alertID'\n\nvar levelTag = 'level'\n\nvar messageField = 'message'\n\nvar durationField = 'duration'\n\nvar outputDB = 'chronograf'\n\nvar outputRP = 'autogen'\n\nvar outputMeasurement = 'alerts'\n\nvar triggerType = 'deadman'\n\nvar threshold = 0.0\n\nvar data = stream\n |from()\n .database(db)\n .retentionPolicy(rp)\n .measurement(measurement)\n .groupBy(groupBy)\n .where(whereFilter)\n\nvar trigger = data\n |deadman(threshold, period)\n .stateChangesOnly()\n .message(message)\n .id(idVar)\n .idTag(idTag)\n .levelTag(levelTag)\n .messageField(messageField)\n .durationField(durationField)\n .sensu()\n .source('Kapacitorsdfasdf')\n\n\ntrigger\n |eval(lambda: \"emitted\")\n .as('value')\n .keep('value', messageField, durationField)\n |eval(lambda: float(\"value\"))\n .as('value')\n .keep()\n |influxDBOut()\n .create()\n .database(outputDB)\n .retentionPolicy(outputRP)\n .measurement(outputMeasurement)\n .tag('alertName', name)\n .tag('triggerType', triggerType)\n\ntrigger\n |httpOut('output')\n",
|
||||||
every: '',
|
every: '',
|
||||||
alertNodes: {
|
alertNodes: {
|
||||||
typeOf: 'alert',
|
typeOf: 'alert',
|
||||||
|
@ -419,15 +339,14 @@ export const kapacitorRules = [
|
||||||
victorOps: [],
|
victorOps: [],
|
||||||
pagerDuty: [],
|
pagerDuty: [],
|
||||||
pushover: [],
|
pushover: [],
|
||||||
sensu: [],
|
sensu: [
|
||||||
slack: [],
|
|
||||||
telegram: [],
|
|
||||||
hipChat: [
|
|
||||||
{
|
{
|
||||||
room: 'asdf',
|
source: 'Kapacitorsdfasdf',
|
||||||
token: '',
|
handlers: [],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
slack: [],
|
||||||
|
telegram: [],
|
||||||
alerta: [],
|
alerta: [],
|
||||||
opsGenie: [],
|
opsGenie: [],
|
||||||
talk: [],
|
talk: [],
|
||||||
|
|
|
@ -29,29 +29,6 @@ export const config = {
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
hipchat: {
|
|
||||||
link: {
|
|
||||||
rel: 'self',
|
|
||||||
href: '/kapacitor/v1/config/hipchat',
|
|
||||||
},
|
|
||||||
elements: [
|
|
||||||
{
|
|
||||||
link: {
|
|
||||||
rel: 'self',
|
|
||||||
href: '/kapacitor/v1/config/hipchat/',
|
|
||||||
},
|
|
||||||
options: {
|
|
||||||
enabled: true,
|
|
||||||
global: false,
|
|
||||||
room: 'hipchat',
|
|
||||||
'state-changes-only': false,
|
|
||||||
token: true,
|
|
||||||
url: 'https://hipchat.hipchat.com/v2/room',
|
|
||||||
},
|
|
||||||
redacted: ['token'],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
influxdb: {
|
influxdb: {
|
||||||
link: {
|
link: {
|
||||||
rel: 'self',
|
rel: 'self',
|
||||||
|
@ -400,13 +377,6 @@ export const configResponse = [
|
||||||
origin: 'alerta',
|
origin: 'alerta',
|
||||||
token: true,
|
token: true,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
type: 'hipChat',
|
|
||||||
enabled: true,
|
|
||||||
url: 'https://hipchat.hipchat.com/v2/room',
|
|
||||||
room: 'hipchat',
|
|
||||||
token: true,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
type: 'opsGenie',
|
type: 'opsGenie',
|
||||||
enabled: true,
|
enabled: true,
|
||||||
|
@ -500,29 +470,6 @@ export const emptyConfig = {
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
hipchat: {
|
|
||||||
link: {
|
|
||||||
rel: 'self',
|
|
||||||
href: '/kapacitor/v1/config/hipchat',
|
|
||||||
},
|
|
||||||
elements: [
|
|
||||||
{
|
|
||||||
link: {
|
|
||||||
rel: 'self',
|
|
||||||
href: '/kapacitor/v1/config/hipchat/',
|
|
||||||
},
|
|
||||||
options: {
|
|
||||||
enabled: false,
|
|
||||||
global: false,
|
|
||||||
room: '',
|
|
||||||
'state-changes-only': false,
|
|
||||||
token: false,
|
|
||||||
url: '',
|
|
||||||
},
|
|
||||||
redacted: ['token'],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
influxdb: {
|
influxdb: {
|
||||||
link: {
|
link: {
|
||||||
rel: 'self',
|
rel: 'self',
|
||||||
|
@ -871,13 +818,6 @@ export const emptyConfigResponse = [
|
||||||
origin: '',
|
origin: '',
|
||||||
token: false,
|
token: false,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
type: 'hipChat',
|
|
||||||
enabled: false,
|
|
||||||
url: '',
|
|
||||||
room: '',
|
|
||||||
token: false,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
type: 'opsGenie',
|
type: 'opsGenie',
|
||||||
enabled: false,
|
enabled: false,
|
||||||
|
@ -965,13 +905,6 @@ export const handlersfromConfig = [
|
||||||
origin: 'alerta',
|
origin: 'alerta',
|
||||||
token: true,
|
token: true,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
type: 'hipChat',
|
|
||||||
enabled: true,
|
|
||||||
url: 'https://hipchat.hipchat.com/v2/room',
|
|
||||||
room: 'hipchat',
|
|
||||||
token: true,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
type: 'opsGenie',
|
type: 'opsGenie',
|
||||||
enabled: true,
|
enabled: true,
|
||||||
|
@ -1120,13 +1053,6 @@ export const handlersOnThisAlertExpected = [
|
||||||
alias: 'telegram-1',
|
alias: 'telegram-1',
|
||||||
type: 'telegram',
|
type: 'telegram',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
enabled: true,
|
|
||||||
room: 'room',
|
|
||||||
token: '',
|
|
||||||
alias: 'hipChat-1',
|
|
||||||
type: 'hipChat',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
enabled: true,
|
enabled: true,
|
||||||
token: '',
|
token: '',
|
||||||
|
@ -1181,7 +1107,6 @@ export const handlersOfKindExpected = {
|
||||||
sensu: 1,
|
sensu: 1,
|
||||||
slack: 1,
|
slack: 1,
|
||||||
telegram: 1,
|
telegram: 1,
|
||||||
hipChat: 1,
|
|
||||||
alerta: 1,
|
alerta: 1,
|
||||||
opsGenie: 2,
|
opsGenie: 2,
|
||||||
talk: 1,
|
talk: 1,
|
||||||
|
@ -1190,7 +1115,7 @@ export const handlersOfKindExpected = {
|
||||||
export const rule = {
|
export const rule = {
|
||||||
id: 'chronograf-v1-8e3ba5df-f5ca-4cf4-848e-7e4a4acde86e',
|
id: 'chronograf-v1-8e3ba5df-f5ca-4cf4-848e-7e4a4acde86e',
|
||||||
tickscript:
|
tickscript:
|
||||||
"var db = 'telegraf'\n\nvar rp = 'autogen'\n\nvar measurement = 'cpu'\n\nvar groupBy = []\n\nvar whereFilter = lambda: (\"host\" == 'denizs-MacBook-Pro.local')\n\nvar name = 'Untitled Rule'\n\nvar idVar = name + ':{{.Group}}'\n\nvar message = ''\n\nvar idTag = 'alertID'\n\nvar levelTag = 'level'\n\nvar messageField = 'message'\n\nvar durationField = 'duration'\n\nvar outputDB = 'chronograf'\n\nvar outputRP = 'autogen'\n\nvar outputMeasurement = 'alerts'\n\nvar triggerType = 'threshold'\n\nvar details = 'lkajsd;fl'\n\nvar crit = 30\n\nvar data = stream\n |from()\n .database(db)\n .retentionPolicy(rp)\n .measurement(measurement)\n .groupBy(groupBy)\n .where(whereFilter)\n |eval(lambda: \"usage_system\")\n .as('value')\n\nvar trigger = data\n |alert()\n .crit(lambda: \"value\" > crit)\n .stateChangesOnly()\n .message(message)\n .id(idVar)\n .idTag(idTag)\n .levelTag(levelTag)\n .messageField(messageField)\n .durationField(durationField)\n .details(details)\n .post('http://example.com')\n .header('key', 'val')\n .tcp('exampleendpoint.com:8082')\n .email()\n .to('bob@domain.com')\n .email()\n .to('asdfsdf')\n .exec('command', 'arg')\n .log('/tmp/log')\n .victorOps()\n .routingKey('victoropsasdf')\n .pagerDuty()\n .pushover()\n .device('asdf')\n .title('asdf')\n .sound('asdf')\n .sensu()\n .source('Kapacitor')\n .handlers('asdf')\n .slack()\n .channel('slack')\n .username('asdf')\n .iconEmoji('asdf')\n .telegram()\n .chatId('telegram')\n .parseMode('Markdown')\n .hipChat()\n .room('room')\n .alerta()\n .resource('alerta')\n .event('alerta')\n .environment('alerta')\n .group('alerta')\n .value('alerta')\n .origin('alerta')\n .services('alerta')\n .opsGenie()\n .teams('team')\n .recipients('recip')\n .opsGenie()\n .teams('team')\n .recipients('team')\n .talk()\n\ntrigger\n |eval(lambda: float(\"value\"))\n .as('value')\n .keep()\n |influxDBOut()\n .create()\n .database(outputDB)\n .retentionPolicy(outputRP)\n .measurement(outputMeasurement)\n .tag('alertName', name)\n .tag('triggerType', triggerType)\n\ntrigger\n |httpOut('output')\n",
|
"var db = 'telegraf'\n\nvar rp = 'autogen'\n\nvar measurement = 'cpu'\n\nvar groupBy = []\n\nvar whereFilter = lambda: (\"host\" == 'denizs-MacBook-Pro.local')\n\nvar name = 'Untitled Rule'\n\nvar idVar = name + ':{{.Group}}'\n\nvar message = ''\n\nvar idTag = 'alertID'\n\nvar levelTag = 'level'\n\nvar messageField = 'message'\n\nvar durationField = 'duration'\n\nvar outputDB = 'chronograf'\n\nvar outputRP = 'autogen'\n\nvar outputMeasurement = 'alerts'\n\nvar triggerType = 'threshold'\n\nvar details = 'lkajsd;fl'\n\nvar crit = 30\n\nvar data = stream\n |from()\n .database(db)\n .retentionPolicy(rp)\n .measurement(measurement)\n .groupBy(groupBy)\n .where(whereFilter)\n |eval(lambda: \"usage_system\")\n .as('value')\n\nvar trigger = data\n |alert()\n .crit(lambda: \"value\" > crit)\n .stateChangesOnly()\n .message(message)\n .id(idVar)\n .idTag(idTag)\n .levelTag(levelTag)\n .messageField(messageField)\n .durationField(durationField)\n .details(details)\n .post('http://example.com')\n .header('key', 'val')\n .tcp('exampleendpoint.com:8082')\n .email()\n .to('bob@domain.com')\n .email()\n .to('asdfsdf')\n .exec('command', 'arg')\n .log('/tmp/log')\n .victorOps()\n .routingKey('victoropsasdf')\n .pagerDuty()\n .pushover()\n .device('asdf')\n .title('asdf')\n .sound('asdf')\n .sensu()\n .source('Kapacitor')\n .handlers('asdf')\n .slack()\n .channel('slack')\n .username('asdf')\n .iconEmoji('asdf')\n .telegram()\n .chatId('telegram')\n .parseMode('Markdown')\n .alerta()\n .resource('alerta')\n .event('alerta')\n .environment('alerta')\n .group('alerta')\n .value('alerta')\n .origin('alerta')\n .services('alerta')\n .opsGenie()\n .teams('team')\n .recipients('recip')\n .opsGenie()\n .teams('team')\n .recipients('team')\n .talk()\n\ntrigger\n |eval(lambda: float(\"value\"))\n .as('value')\n .keep()\n |influxDBOut()\n .create()\n .database(outputDB)\n .retentionPolicy(outputRP)\n .measurement(outputMeasurement)\n .tag('alertName', name)\n .tag('triggerType', triggerType)\n\ntrigger\n |httpOut('output')\n",
|
||||||
query: {
|
query: {
|
||||||
id: 'chronograf-v1-8e3ba5df-f5ca-4cf4-848e-7e4a4acde86e',
|
id: 'chronograf-v1-8e3ba5df-f5ca-4cf4-848e-7e4a4acde86e',
|
||||||
database: 'telegraf',
|
database: 'telegraf',
|
||||||
|
@ -1294,12 +1219,6 @@ export const rule = {
|
||||||
disableNotification: false,
|
disableNotification: false,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
hipChat: [
|
|
||||||
{
|
|
||||||
room: 'room',
|
|
||||||
token: '',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
alerta: [
|
alerta: [
|
||||||
{
|
{
|
||||||
token: '',
|
token: '',
|
||||||
|
|
Loading…
Reference in New Issue