azure-cli
Version:
Microsoft Azure Cross Platform Command Line tool
252 lines (206 loc) • 8.28 kB
JavaScript
/**
* Copyright (c) Microsoft. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
;
var __ = require('underscore');
var util = require('util');
var utils = require('../../../util/utils');
var profile = require('../../../util/profile');
var moment = require('moment');
var $ = utils.getLocaleString;
// 1 hour in milliseconds
var _defaultQueryTimeRange = 3600000;
// 15 days in milliseconds
var _maximumDateDifferenceAllowed = 15 * 24 * 3600000;
exports.selectedFields = 'Authorization,Caller,CorrelationId,EventTimestamp,OperationName,ResourceGroupName,ResourceId,Status,SubscriptionId,SubStatus';
exports.alertsEventSourceName = 'microsoft.insights/alertrules';
exports.autoscaleEventSourceName = 'microsoft.insights/autoscalesettings';
exports.defaultWindowSize = moment.duration('01:00:00');
exports.defaultTimeAggregationOperator = 'Average';
exports.minimumTimeGrain = moment.duration('00:01:00');
exports.minimumTimeWindow = moment.duration('00:05:00');
exports.defaultApiVersion = '2014-04-01';
exports.createInsightsManagementClient = function(log, options) {
var subscription = profile.current.getSubscription(options.subscription);
return utils.createInsightsManagementClient(subscription);
};
exports.createInsightsClient = function (log, options) {
var subscription = profile.current.getSubscription(options.subscription);
return utils.createInsightsClient(subscription);
};
// Pass-all filter
exports.passAllFilter = function () { return true; };
exports.addConditionIfPresent = function (currentQueryFilter, name, value) {
if (value) {
return util.format('%s and %s eq \'%s\'', currentQueryFilter, name, value);
} else {
return currentQueryFilter;
}
};
exports.addMetricNamesFilter = function(metricNames) {
var output = '';
if (__.isString(metricNames)) {
var clauses = [];
var names = metricNames.split(',');
__.each(names, function(name) { clauses.push('name.value eq \'' + name + '\''); });
output = clauses.join(' or ');
}
return output;
};
exports.validateDateTimeRangeAndAddDefaultsEvents = function(startTime, endTime) {
return _validateDateTimeRangeAndAddDefaults(startTime, endTime, 'eventTimestamp ge \'%s\' and eventTimestamp le \'%s\'');
};
exports.validateDateTimeRangeAndAddDefaultsMetrics = function(startTime, endTime) {
return _validateDateTimeRangeAndAddDefaults(startTime, endTime, 'startTime eq %s and endTime eq %s');
};
function _validateDateTimeRangeAndAddDefaults(startTime, endTime, formatStr) {
var endDateUtc = _validateEndDate(endTime);
var startDateUtc = _validateStartDate(startTime, endDateUtc);
_validateDateRange(startDateUtc, endDateUtc);
return util.format(formatStr, startDateUtc.toISOString(), endDateUtc.toISOString());
}
// Validates the endTime parameter
function _validateEndDate(endTime) {
var endDate = new Date();
if (__.isString(endTime)) {
var parsedEndDate = Date.parse(endTime);
if (__.isNaN(parsedEndDate)) {
throw new Error(util.format($('%s parameter is not a valid Date \"%s\"'), 'endTime', endTime));
}
endDate = new Date(parsedEndDate);
}
return endDate;
}
// Validates the startTime parameter
function _validateStartDate(startTime, endDate) {
if (!__.isDate(endDate)) {
throw new Error(util.format($('%s parameter is not a valid Date \"%s\"'), 'endDate', endDate));
}
var startDate = new Date(endDate.getTime() - _defaultQueryTimeRange);
if (__.isString(startTime)) {
var parsedStartDate = Date.parse(startTime);
if (__.isNaN(parsedStartDate)) {
throw new Error(util.format($('%s parameter is not a valid Date \"%s\"'), 'startDate', startTime));
}
startDate = new Date(parsedStartDate);
}
if (startDate > new Date()) {
throw new Error($('Start date is later than Now'));
}
return startDate;
}
// Validates the date range
function _validateDateRange(startDate, endDate) {
if (!__.isDate(endDate)) {
throw new Error(util.format($('%s parameter is not a valid Date \"%s\"'), 'endDate', endDate));
}
if (!__.isDate(startDate)) {
throw new Error(util.format($('%s parameter is not a valid Date \"%s\"'), 'startDate', startDate));
}
if (endDate < startDate) {
throw new Error($('End date is earlier than start date'));
}
var difference = endDate - startDate;
if (difference > _maximumDateDifferenceAllowed) {
throw new Error(util.format($('Time range exceeds maximum allowed of %s days. Start date: %s, end date: %s'), _maximumDateDifferenceAllowed / (24 * 3600000), startDate.toISOString(), endDate.toISOString()));
}
}
// Validation of input TimeSpans in format hh:mm:ss
exports.validateTimeSpan = function(timeSpan) {
return moment.duration(timeSpan);
};
exports.validateEnumerationParameter = function (inputValue, setOfValues, errorMessage) {
var operatorTemp = '|' + inputValue.toLowerCase().replace('|', '') + '|';
if (setOfValues.toLowerCase().search(operatorTemp) == -1) {
throw new Error(util.format($(errorMessage), inputValue));
}
};
function _padSpaces(tabs) {
if (tabs > 0) {
return ' ' + _padSpaces(tabs - 1);
}
return '';
}
// Shows the objects as lists of fieldName: fieldValue
// TODO: add details and better formatting to the deeper levels
exports.showObject = function(log, object, indentationTabs) {
var tabs = __.isNumber(indentationTabs) ? indentationTabs : 0;
var spaces = _padSpaces(tabs);
if (!__.isObject(object)) {
log.data(spaces + object);
return;
}
for (var propertyName in object) {
var prop = object[propertyName];
if (__.isNull(prop) || __.isUndefined(prop)) {
log.data(spaces + propertyName + ':');
} else if (__.isArray(prop)) {
log.data(spaces + propertyName + ':');
for(var i = 0; i < prop.length; i++) {
exports.showObject(log, prop[i], tabs + 1);
}
} else if (!__.isFunction(prop)) { // Do not recurse if the prop is a function
if (object[propertyName].toISOString !== undefined) { // Special case for TimeGrain objects returned by server
log.data(spaces + propertyName + ': ' + object[propertyName].toISOString());
} else if (__.isObject(object[propertyName])) {
log.data(spaces + propertyName + ':');
exports.showObject(log, object[propertyName], tabs + 1);
} else {
log.data(spaces + propertyName + ': ' + object[propertyName]);
}
}
}
};
exports.formatOutputList = function (cli, log, options, values) {
log.silly(values !== undefined ? 'values is NOT undefined' : 'values is undefined');
if (options.json) {
cli.output.json(values);
} else {
var elementDisplayer = function(element) {
exports.showObject(log, element);
log.data('------------------------------------------------------------------------------------');
};
__.each(values, elementDisplayer);
}
};
exports.formatOutput = function (cli, log, options, value) {
log.silly(value !== undefined ? 'value is NOT undefined' : 'value is undefined');
if (options.json) {
cli.output.json(value);
} else {
exports.showObject(log, value);
}
};
// This will be used until retention is implemented for diagnostic settings
exports.removeRetentionPolicy = function (properties) {
if (!properties) {
return;
}
var i;
if (properties.logs) {
for (i = 0; i < properties.logs.length; i++) {
var logs = properties.logs[i];
delete logs.retentionPolicy;
}
}
if (properties.metrics) {
for (i = 0; i < properties.metrics.length; i++) {
var metrics = properties.metrics[i];
delete metrics.retentionPolicy;
}
}
};
exports.isEmptyOrSpaces = function (str) {
return str === undefined || str === null || str.match(/^ *$/) !== null;
};