/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with this * work for additional information regarding copyright ownership. The ASF * 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. */ var App = require('app'); require('mappers/alert_definitions_mapper'); var testHelpers = require('test/helpers'); describe('App.alertDefinitionsMapper', function () { /*eslint-disable mocha-cleanup/asserts-limit */ describe('#map', function () { var json = { items: [ { "AlertDefinition" : { "component_name" : "RESOURCEMANAGER", "enabled" : true, "id" : 1, "ignore_host" : false, "interval" : 5, "label" : "ResourceManager RPC Latency", "name" : "yarn_resourcemanager_rpc_latency", "description" : "some description", "scope" : "ANY", "service_name" : "YARN", "source" : { "jmx" : { "property_list" : [ "Hadoop:service=ResourceManager,name=RpcActivityForPort*/RpcQueueTimeAvgTime", "Hadoop:service=ResourceManager,name=RpcActivityForPort*/RpcProcessingTimeAvgTime" ], "value" : "{0}" }, "reporting" : { "ok" : { "text" : "Average Queue Time:[{0}], Average Processing Time:[{1}]" }, "warning" : { "text" : "Average Queue Time:[{0}], Average Processing Time:[{1}]", "value" : 3000.0 }, "critical" : { "text" : "Average Queue Time:[{0}], Average Processing Time:[{1}]", "value" : 5000.0 } }, "type" : "METRIC", "uri" : { "http" : "{{yarn-site/yarn.resourcemanager.webapp.address}}", "https" : "{{yarn-site/yarn.resourcemanager.webapp.https.address}}", "https_property" : "{{yarn-site/yarn.http.policy}}", "https_property_value" : "HTTPS_ONLY", "default_port" : 0.0 } } } }, { "AlertDefinition" : { "component_name" : "RESOURCEMANAGER", "enabled" : true, "id" : 2, "ignore_host" : false, "interval" : 1, "label" : "ResourceManager Web UI", "name" : "yarn_resourcemanager_webui", "description" : "", "scope" : "ANY", "service_name" : "YARN", "source" : { "reporting" : { "ok" : { "text" : "HTTP {0} response in {2:.4f} seconds" }, "warning" : { "text" : "HTTP {0} response in {2:.4f} seconds" }, "critical" : { "text" : "Connection failed to {1}" } }, "type" : "WEB", "uri" : { "http" : "{{yarn-site/yarn.resourcemanager.webapp.address}}", "https" : "{{yarn-site/yarn.resourcemanager.webapp.https.address}}", "https_property" : "{{yarn-site/yarn.http.policy}}", "https_property_value" : "HTTPS_ONLY", "connection_timeout" : 5.0, "default_port" : 0.0 } } } }, { "AlertDefinition" : { "component_name" : null, "enabled" : true, "id" : 3, "ignore_host" : false, "interval" : 1, "label" : "Percent NodeManagers Available", "name" : "yarn_nodemanager_webui_percent", "description" : null, "scope" : "SERVICE", "service_name" : "YARN", "source" : { "alert_name" : "yarn_nodemanager_webui", "reporting" : { "ok" : { "text" : "affected: [{1}], total: [{0}]" }, "warning" : { "text" : "affected: [{1}], total: [{0}]", "value" : 0.1 }, "critical" : { "text" : "affected: [{1}], total: [{0}]", "value" : 0.3 } }, "type" : "AGGREGATE" } } }, { "AlertDefinition" : { "component_name" : "NODEMANAGER", "enabled" : true, "id" : 4, "ignore_host" : false, "interval" : 1, "label" : "NodeManager Health", "name" : "yarn_nodemanager_health", "description" : "some description", "scope" : "HOST", "service_name" : "YARN", "source" : { "parameters" : [ { "name" : "connection.timeout", "display_name" : "Connection Timeout", "units" : "seconds", "value" : 5.0, "description" : "The maximum time before this alert is considered to be CRITICAL", "type" : "NUMERIC", "threshold" : "CRITICAL" } ], "path" : "HDP/2.0.6/services/YARN/package/files/alert_nodemanager_health.py", "type" : "SCRIPT" } } }, { "AlertDefinition" : { "component_name" : "ZOOKEEPER_SERVER", "enabled" : true, "id" : 5, "ignore_host" : false, "interval" : 1, "label" : "ZooKeeper Server Process", "name" : "zookeeper_server_process", "description" : "some description", "scope" : "ANY", "service_name" : "ZOOKEEPER", "source" : { "default_port" : 2181.0, "reporting" : { "ok" : { "text" : "TCP OK - {0:.4f} response on port {1}" }, "critical" : { "text" : "Connection failed: {0} to {1}:{2}" } }, "type" : "PORT", "uri" : "{{zookeeper-env/clientPort}}" } } }, { "AlertDefinition" : { "component_name" : "NAMENODE", "description" : "This service-level alert is triggered if the NN heap usage deviation has grown beyond the specified threshold within a given time interval.", "enabled" : true, "help_url" : "http://test.test", "id" : 6, "ignore_host" : false, "interval" : 1, "label" : "NameNode Heap Usage (Hourly)", "name" : "namenode_free_heap_size_deviation_percentage", "repeat_tolerance" : 1, "repeat_tolerance_enabled" : true, "scope" : "SERVICE", "service_name" : "HDFS", "source" : { "ams" : { "metric_list" : [ "jvm.JvmMetrics.MemHeapUsedM", "jvm.JvmMetrics.MemHeapMaxM" ], "value" : "{1} - {0}", "interval" : 60.0, "compute" : "sample_standard_deviation_percentage", "app_id" : "NAMENODE", "minimum_value" : 1.0 }, "reporting" : { "ok" : { "text" : "The sample standard deviation percentage is {0}%" }, "warning" : { "text" : "The sample standard deviation percentage is {0}%", "value" : 20.0 }, "critical" : { "text" : "The sample standard deviation percentage is {0}%", "value" : 50.0 }, "units" : "%" }, "type" : "AMS", "uri" : { "http" : "{{ams-site/timeline.metrics.service.webapp.address}}", "https" : "{{ams-site/timeline.metrics.service.webapp.address}}", "https_property" : "{{ams-site/timeline.metrics.service.http.policy}}", "https_property_value" : "HTTPS_ONLY", "default_port" : 0.0, "connection_timeout" : 5.0 } } } } ] }; beforeEach(function () { App.alertDefinitionsMapper.setProperties({ 'model': {}, 'parameterModel': {}, 'reportModel': {}, 'metricsSourceModel': {}, 'metricsUriModel': {}, 'metricsAmsModel': {} }); sinon.stub(App.alertDefinitionsMapper, 'deleteRecord', Em.K); sinon.stub(App.store, 'commit', Em.K); sinon.stub(App.store, 'loadMany', function (type, content) { type.content = content; }); sinon.stub(App.router, 'get', function() {return false;}); App.cache.previousAlertGroupsMap = {}; sinon.stub(App.alertDefinitionsMapper, 'setMetricsSourcePropertyLists', Em.K); sinon.stub(App.alertDefinitionsMapper, 'setAlertDefinitionsRawSourceData', Em.K); }); afterEach(function () { App.store.commit.restore(); App.store.loadMany.restore(); App.alertDefinitionsMapper.setProperties({ 'model': App.AlertDefinition, 'reportModel': App.AlertReportDefinition, 'metricsSourceModel': App.AlertMetricsSourceDefinition, 'metricsUriModel': App.AlertMetricsUriDefinition, 'metricsAmsModel': App.AlertMetricsAmsDefinition }); App.alertDefinitionsMapper.deleteRecord.restore(); App.router.get.restore(); App.cache.previousAlertGroupsMap = {}; App.alertDefinitionsMapper.setMetricsSourcePropertyLists.restore(); App.alertDefinitionsMapper.setAlertDefinitionsRawSourceData.restore(); }); describe('should parse METRIC alertDefinitions', function () { var data = {items: [json.items[0]]}, expected = [{ id: 1, "name": "yarn_resourcemanager_rpc_latency", "label": "ResourceManager RPC Latency", "description" : "some description", "service_id": "YARN", "component_name": "RESOURCEMANAGER", "enabled": true, "scope": "ANY", "interval": 5, "type": "METRIC", "jmx_id": "1jmx", "uri_id": "1uri" }], expectedMetricsSource = [{ "id":"1jmx", "value":"{0}", "property_list":[ "Hadoop:service=ResourceManager,name=RpcActivityForPort*/RpcQueueTimeAvgTime", "Hadoop:service=ResourceManager,name=RpcActivityForPort*/RpcProcessingTimeAvgTime" ] }], expectedMetricsUri = [{ "id":"1uri", "http":"{{yarn-site/yarn.resourcemanager.webapp.address}}", "https":"{{yarn-site/yarn.resourcemanager.webapp.https.address}}", "https_property":"{{yarn-site/yarn.http.policy}}", "https_property_value":"HTTPS_ONLY" }]; beforeEach(function () { App.alertDefinitionsMapper.map(data); }); it('parsing metrics model', function() { testHelpers.nestedExpect(expected, App.alertDefinitionsMapper.get('model.content')); }); it('parse metrics source', function() { testHelpers.nestedExpect(expectedMetricsSource, App.alertDefinitionsMapper.get('metricsSourceModel.content')); }); it('parse metrics uri', function() { testHelpers.nestedExpect(expectedMetricsUri, App.alertDefinitionsMapper.get('metricsUriModel.content')); }); }); describe('should parse WEB alertDefinitions', function () { var data = {items: [json.items[1]]}, expected = [ { "id": 2, "name": "yarn_resourcemanager_webui", "label": "ResourceManager Web UI", "description" : "", "service_id": "YARN", "component_name": "RESOURCEMANAGER", "enabled": true, "scope": "ANY", "interval": 1, "type": "WEB", "uri_id": "2uri" } ], expectedMetricsUri = [{ "id":"2uri", "http":"{{yarn-site/yarn.resourcemanager.webapp.address}}", "https":"{{yarn-site/yarn.resourcemanager.webapp.https.address}}", "https_property":"{{yarn-site/yarn.http.policy}}", "https_property_value":"HTTPS_ONLY", "connection_timeout" : 5.0 }]; beforeEach(function () { App.alertDefinitionsMapper.map(data); }); it('parsing web model', function() { testHelpers.nestedExpect(expected, App.alertDefinitionsMapper.get('model.content')); }); it('parse metrics uri', function() { testHelpers.nestedExpect(expectedMetricsUri, App.alertDefinitionsMapper.get('metricsUriModel.content')); }); }); it('should parse AGGREGATE alertDefinitions', function () { var data = {items: [json.items[2]]}, expected = [ { "id":3, "name":"yarn_nodemanager_webui_percent", "label":"Percent NodeManagers Available", "description" : "", "service_id":"YARN", "component_name":null, "enabled":true, "scope":"SERVICE", "interval":1, "type":"AGGREGATE", "alert_name":"yarn_nodemanager_webui" } ]; App.alertDefinitionsMapper.map(data); testHelpers.nestedExpect(expected, App.alertDefinitionsMapper.get('model.content')); }); describe('should parse SCRIPT alertDefinitions', function () { var data = {items: [json.items[3]]}, expected = [ { "id":4, "name":"yarn_nodemanager_health", "label":"NodeManager Health", "description" : "some description", "service_id":"YARN", "component_name":"NODEMANAGER", "enabled":true, "scope":"HOST", "interval":1, "type":"SCRIPT", "location":"HDP/2.0.6/services/YARN/package/files/alert_nodemanager_health.py" } ]; var expectedParameters = [{ "id": "4connection.timeout", "name": "connection.timeout", "display_name": "Connection Timeout", "units": "seconds", "value": 5, "description": "The maximum time before this alert is considered to be CRITICAL", "type": "NUMERIC", "threshold": "CRITICAL" }]; beforeEach(function () { App.alertDefinitionsMapper.map(data); }); it('should map definition', function () { testHelpers.nestedExpect(expected, App.alertDefinitionsMapper.get('model.content')); }); it('should map parameters', function () { testHelpers.nestedExpect(expectedParameters, App.alertDefinitionsMapper.get('parameterModel.content')); }); }); it('should parse PORT alertDefinitions', function () { var data = {items: [json.items[4]]}, expected = [ { "id":5, "name":"zookeeper_server_process", "label":"ZooKeeper Server Process", "description" : "some description", "service_id":"ZOOKEEPER", "component_name":"ZOOKEEPER_SERVER", "enabled":true, "scope":"ANY", "interval":1, "type":"PORT", "default_port":2181, "port_uri":"{{zookeeper-env/clientPort}}" } ]; App.alertDefinitionsMapper.map(data); testHelpers.nestedExpect(expected, App.alertDefinitionsMapper.get('model.content')); }); describe('should parse AMS alertDefinitions', function () { var data = {items: [json.items[5]]}; var expected = [ { "id" : 6, "interval" : 1, "label" : "NameNode Heap Usage (Hourly)", "name" : "namenode_free_heap_size_deviation_percentage", "repeat_tolerance" : 1, "repeat_tolerance_enabled" : true, "scope" : "SERVICE", "service_name" : "HDFS", "component_name" : "NAMENODE", "help_url" : "http://test.test" } ]; var expectedMetricsUri = [{ "id":"6uri", "http" : "{{ams-site/timeline.metrics.service.webapp.address}}", "https" : "{{ams-site/timeline.metrics.service.webapp.address}}", "https_property" : "{{ams-site/timeline.metrics.service.http.policy}}", "https_property_value" : "HTTPS_ONLY", "connection_timeout" : 5.0 }]; var expectedAms = [{ "id": "6ams", "value": "{1} - {0}", "minimal_value": 1, "interval": 60 }]; beforeEach(function () { App.alertDefinitionsMapper.map(data); }); it('should map definition', function () { testHelpers.nestedExpect(expected, App.alertDefinitionsMapper.get('model.content')); }); it('parse metrics uri', function() { testHelpers.nestedExpect(expectedMetricsUri, App.alertDefinitionsMapper.get('metricsUriModel.content')); }); it('parse ams parameters', function () { testHelpers.nestedExpect(expectedAms, App.alertDefinitionsMapper.get('metricsAmsModel.content')); }); }); /*eslint-disable mocha-cleanup/complexity-it */ it('should set groups from App.cache.previousAlertGroupsMap', function () { App.cache.previousAlertGroupsMap = { 1: [5,1], 2: [4,3], 3: [3,2], 4: [2,5], 5: [1,4] }; App.alertDefinitionsMapper.map(json); expect(App.alertDefinitionsMapper.get('model.content')[0].groups).to.eql([5, 1]); expect(App.alertDefinitionsMapper.get('model.content')[1].groups).to.eql([4, 3]); expect(App.alertDefinitionsMapper.get('model.content')[2].groups).to.eql([3, 2]); expect(App.alertDefinitionsMapper.get('model.content')[3].groups).to.eql([2, 5]); expect(App.alertDefinitionsMapper.get('model.content')[4].groups).to.eql([1, 4]); }); /*eslint-enable mocha-cleanup/complexity-it */ describe('should delete not existing definitions', function () { var definitions = [ Em.Object.create({id: 100500, type: 'PORT'}) ]; beforeEach(function () { sinon.stub(App.AlertDefinition, 'find', function () { return definitions; }); }); afterEach(function() { App.AlertDefinition.find.restore(); }); it('should delete PORT alert definition with id 100500', function () { App.alertDefinitionsMapper.map(json); expect(App.alertDefinitionsMapper.deleteRecord.calledOnce).to.be.true; expect(App.alertDefinitionsMapper.deleteRecord.args[0][0].id).to.equal(100500); }); }); }); /*eslint-enable mocha-cleanup/asserts-limit */ });