diff options
author | Koren Lev <korenlev@gmail.com> | 2017-07-27 16:42:15 +0300 |
---|---|---|
committer | Koren Lev <korenlev@gmail.com> | 2017-07-27 16:42:15 +0300 |
commit | b88c78e3cf2bef22aa2f1c4d0bf305e303bc15f0 (patch) | |
tree | ffa30a6e1511d72562d8772b8700cda52b2752a1 /ui/imports/api/environments | |
parent | b70483739d1f6f4f0d31987ed2e4d1e30d71d579 (diff) |
adding calipso ui
Change-Id: Ifa6f63daebb07f45580f747341960e898fdb00c4
Signed-off-by: Koren Lev <korenlev@gmail.com>
Diffstat (limited to 'ui/imports/api/environments')
10 files changed, 1047 insertions, 0 deletions
diff --git a/ui/imports/api/environments/configuration-groups/aci-configuration.js b/ui/imports/api/environments/configuration-groups/aci-configuration.js new file mode 100644 index 0000000..10b749e --- /dev/null +++ b/ui/imports/api/environments/configuration-groups/aci-configuration.js @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others / +// / +// All rights reserved. This program and the accompanying materials / +// are made available under the terms of the Apache License, Version 2.0 / +// which accompanies this distribution, and is available at / +// http://www.apache.org/licenses/LICENSE-2.0 / +///////////////////////////////////////////////////////////////////////////////////////// +import { SimpleSchema } from 'meteor/aldeed:simple-schema'; + +export const AciSchema = new SimpleSchema({ + name: { + type: String, + autoValue: function () { return 'ACI'; } + }, + host: { + type: String, + regEx: SimpleSchema.RegEx.IP, + defaultValue: '10.56.0.104', + }, + user: { + type: String, + defaultValue: 'admin' + }, + pwd: { + type: String, + defaultValue: 'C1sco12345' + }, +}); diff --git a/ui/imports/api/environments/configuration-groups/amqp-configuration.js b/ui/imports/api/environments/configuration-groups/amqp-configuration.js new file mode 100644 index 0000000..83a15cf --- /dev/null +++ b/ui/imports/api/environments/configuration-groups/amqp-configuration.js @@ -0,0 +1,29 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others / +// / +// All rights reserved. This program and the accompanying materials / +// are made available under the terms of the Apache License, Version 2.0 / +// which accompanies this distribution, and is available at / +// http://www.apache.org/licenses/LICENSE-2.0 / +///////////////////////////////////////////////////////////////////////////////////////// +import { SimpleSchema } from 'meteor/aldeed:simple-schema'; +import { portRegEx } from '/imports/lib/general-regex'; + +export const AMQPSchema = new SimpleSchema({ + name: { type: String, autoValue: function () { return 'AMQP'; } }, + host: { + type: String, + regEx: SimpleSchema.RegEx.IP, + defaultValue: '10.0.0.1', + }, + port: { + type: String, + regEx: portRegEx, + defaultValue: '5673', + }, + user: { + type: String, + defaultValue: 'rabbitmquser' + }, + password: { type: String }, +}); diff --git a/ui/imports/api/environments/configuration-groups/cli-configuration.js b/ui/imports/api/environments/configuration-groups/cli-configuration.js new file mode 100644 index 0000000..c651359 --- /dev/null +++ b/ui/imports/api/environments/configuration-groups/cli-configuration.js @@ -0,0 +1,69 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others / +// / +// All rights reserved. This program and the accompanying materials / +// are made available under the terms of the Apache License, Version 2.0 / +// which accompanies this distribution, and is available at / +// http://www.apache.org/licenses/LICENSE-2.0 / +///////////////////////////////////////////////////////////////////////////////////////// +import * as R from 'ramda'; +import { SimpleSchema } from 'meteor/aldeed:simple-schema'; +import { pathRegEx } from '/imports/lib/general-regex'; + +export const CLISchema = new SimpleSchema({ + name: { type: String, autoValue: function () { return 'CLI'; } }, + host: { + type: String, + defaultValue: '10.0.0.1' + }, + key: { + type: String, + regEx: pathRegEx, + optional: true + }, + user: { + type: String, + defaultValue: 'sshuser' + }, + pwd: { + type: String, + optional: true + }, +}); + +CLISchema.addValidator(function () { + let that = this; + + let conf = {}; + if (isConfEmpty(conf)) { + return; + } + + let validationResult = R.find((validationFn) => { + return validationFn(that).isError; + }, [ keyPasswordValidation ]); + + if (R.isNil(validationResult)) { return; } + + throw validationResult(that); +}); + +function keyPasswordValidation(schemaItem) { + let password = schemaItem.field('pwd'); + let key = schemaItem.field('key'); + + if (key.value || password.value) { return { isError: false }; } + + return { + isError: true, + type: 'subGroupError', + data: [], + message: 'Master Host Group: At least one required: key or password' + }; +} + +function isConfEmpty(conf) { + return R.find((key) => { + return !(R.isNil(conf[key])); + }, R.keys(conf)); +} diff --git a/ui/imports/api/environments/configuration-groups/monitoring-configuration.js b/ui/imports/api/environments/configuration-groups/monitoring-configuration.js new file mode 100644 index 0000000..2b27f8a --- /dev/null +++ b/ui/imports/api/environments/configuration-groups/monitoring-configuration.js @@ -0,0 +1,119 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others / +// / +// All rights reserved. This program and the accompanying materials / +// are made available under the terms of the Apache License, Version 2.0 / +// which accompanies this distribution, and is available at / +// http://www.apache.org/licenses/LICENSE-2.0 / +///////////////////////////////////////////////////////////////////////////////////////// +import { SimpleSchema } from 'meteor/aldeed:simple-schema'; +import * as R from 'ramda'; +import { Constants } from '/imports/api/constants/constants'; +import { portRegEx } from '/imports/lib/general-regex'; +import { hostnameRegex } from '/imports/lib/general-regex'; +import { ipAddressRegex } from '/imports/lib/general-regex'; +import { pathRegEx } from '/imports/lib/general-regex'; + +export const MonitoringSchema = new SimpleSchema({ + name: { type: String, autoValue: function () { return 'Monitoring'; } }, + //app_path: { type: String, autoValue: function () { return '/etc/calipso/monitoring'; } }, + + config_folder: { + type: String, + defaultValue: '/local_dir/sensu_config', + regEx: pathRegEx, + }, + + env_type: { + type: String, + defaultValue: 'production', + custom: function () { + let that = this; + let EnvTypesRec = Constants.findOne({ name: 'env_types' }); + + if (R.isNil(EnvTypesRec.data)) { return 'notAllowed'; } + let EnvTypes = EnvTypesRec.data; + + if (R.isNil(R.find(R.propEq('value', that.value), EnvTypes))) { + return 'notAllowed'; + } + }, + }, + + rabbitmq_port: { + type: String, + defaultValue: '5671', + regEx: portRegEx, + }, + + rabbitmq_user: { + type: String, + defaultValue: 'sensu' + }, + + rabbitmq_pass: { type: String }, + + server_ip: { + type: String, + regEx: new RegExp(hostnameRegex.source + '|' + ipAddressRegex.soure), + defaultValue: '10.0.0.1', + }, + + server_name: { + type: String, + defaultValue: 'sensu_server', + }, + + type: { + type: String, + defaultValue: 'Sensu', + custom: function () { + let that = this; + let values = Constants.findOne({ name: 'environment_monitoring_types' }).data; + + if (R.isNil(values)) { return 'notAllowed'; } + + if (R.isNil(R.find(R.propEq('value', that.value), values))) { + return 'notAllowed'; + } + }, + }, + + provision: { + type: String, + defaultValue: 'None', + custom: function () { + let that = this; + let values = Constants.findOne({ name: 'environment_provision_types' }).data; + + if (R.isNil(values)) { return 'notAllowed'; } + + if (R.isNil(R.find(R.propEq('value', that.value), values))) { + return 'notAllowed'; + } + }, + }, + + ssh_port: { + type: String, + defaultValue: '20022', + optional: true + }, + + ssh_user: { + type: String, + defaultValue: 'root', + optional: true + }, + + ssh_password: { + type: String, + defaultValue: 'calipso', + optional: true + }, + + api_port: { + type: Number, + defaultValue: 4567, + }, +}); diff --git a/ui/imports/api/environments/configuration-groups/mysql-configuration.js b/ui/imports/api/environments/configuration-groups/mysql-configuration.js new file mode 100644 index 0000000..1921432 --- /dev/null +++ b/ui/imports/api/environments/configuration-groups/mysql-configuration.js @@ -0,0 +1,33 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others / +// / +// All rights reserved. This program and the accompanying materials / +// are made available under the terms of the Apache License, Version 2.0 / +// which accompanies this distribution, and is available at / +// http://www.apache.org/licenses/LICENSE-2.0 / +///////////////////////////////////////////////////////////////////////////////////////// +import { SimpleSchema } from 'meteor/aldeed:simple-schema'; +import { portRegEx } from '/imports/lib/general-regex'; + +export const MysqlSchema = new SimpleSchema({ + name: { + type: String, + autoValue: function () { return 'mysql'; } + }, + host: { + type: String, + regEx: SimpleSchema.RegEx.IP, + defaultValue: '10.0.0.1' + }, + password: { type: String }, + port: { + type: String, + regEx: portRegEx, + defaultValue: '3307' + }, + user: { + type: String, + min: 3, + defaultValue: 'mysqluser' + }, +}); diff --git a/ui/imports/api/environments/configuration-groups/nfv-provider-configuration.js b/ui/imports/api/environments/configuration-groups/nfv-provider-configuration.js new file mode 100644 index 0000000..3638e3b --- /dev/null +++ b/ui/imports/api/environments/configuration-groups/nfv-provider-configuration.js @@ -0,0 +1,25 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others / +// / +// All rights reserved. This program and the accompanying materials / +// are made available under the terms of the Apache License, Version 2.0 / +// which accompanies this distribution, and is available at / +// http://www.apache.org/licenses/LICENSE-2.0 / +///////////////////////////////////////////////////////////////////////////////////////// +import { SimpleSchema } from 'meteor/aldeed:simple-schema'; +import { portRegEx } from '/imports/lib/general-regex'; + +export const NfvProviderSchema = new SimpleSchema({ + name: { type: String, autoValue: function () { return 'NFV_provider'; } }, + host: { + type: String, + regEx: SimpleSchema.RegEx.IP, + }, + nfv_token: { type: String }, + port: { + type: String, + regEx: portRegEx + }, + user: { type: String }, + pwd: { type: String }, +}); diff --git a/ui/imports/api/environments/configuration-groups/open-stack-configuration.js b/ui/imports/api/environments/configuration-groups/open-stack-configuration.js new file mode 100644 index 0000000..a0d710f --- /dev/null +++ b/ui/imports/api/environments/configuration-groups/open-stack-configuration.js @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others / +// / +// All rights reserved. This program and the accompanying materials / +// are made available under the terms of the Apache License, Version 2.0 / +// which accompanies this distribution, and is available at / +// http://www.apache.org/licenses/LICENSE-2.0 / +///////////////////////////////////////////////////////////////////////////////////////// +import { SimpleSchema } from 'meteor/aldeed:simple-schema'; +import { portRegEx } from '/imports/lib/general-regex'; + +export const OpenStackSchema = new SimpleSchema({ + name: { type: String, autoValue: function () { return 'OpenStack'; } }, + host: { + type: String, + regEx: SimpleSchema.RegEx.IP, + defaultValue: '10.0.0.1', + }, + admin_token: { type: String }, + port: { + type: String, + regEx: portRegEx, + defaultValue: '5000', + }, + user: { + type: String, + defaultValue: 'adminuser' + }, + pwd: { type: String }, +}); diff --git a/ui/imports/api/environments/environments.js b/ui/imports/api/environments/environments.js new file mode 100644 index 0000000..d616960 --- /dev/null +++ b/ui/imports/api/environments/environments.js @@ -0,0 +1,457 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others / +// / +// All rights reserved. This program and the accompanying materials / +// are made available under the terms of the Apache License, Version 2.0 / +// which accompanies this distribution, and is available at / +// http://www.apache.org/licenses/LICENSE-2.0 / +///////////////////////////////////////////////////////////////////////////////////////// +import { Mongo } from 'meteor/mongo'; +import { SimpleSchema } from 'meteor/aldeed:simple-schema'; +import * as R from 'ramda'; +import { Constants } from '/imports/api/constants/constants'; +import { MysqlSchema } from './configuration-groups/mysql-configuration'; +import { OpenStackSchema } from './configuration-groups/open-stack-configuration'; +import { MonitoringSchema } from './configuration-groups/monitoring-configuration'; +import { CLISchema } from './configuration-groups/cli-configuration'; +import { AMQPSchema } from './configuration-groups/amqp-configuration'; +//import { NfvProviderSchema } from './configuration-groups/nfv-provider-configuration'; +import { AciSchema } from './configuration-groups/aci-configuration'; +import { + isMonitoringSupported, + isListeningSupported, +} from '/imports/api/supported_environments/supported_environments'; + +export const Environments = new Mongo.Collection( + 'environments_config', { idGeneration: 'MONGO' }); + +export const requiredConfGroups = [ + 'mysql', + 'OpenStack', + 'CLI', +]; + +export const optionalConfGroups = [ + // 'NFV_provider', + 'AMQP', + 'Monitoring', + 'ACI', +]; + +let simpleSchema = new SimpleSchema({ + _id: { type: { _str: { type: String, regEx: SimpleSchema.RegEx.Id } } }, + auth: { + type: Object, + blackbox: true, + defaultValue: { + 'view-env': [ + ], + 'edit-env': [ + ] + } + }, + configuration: { + type: [Object], + blackbox: true, + autoValue: function () { + console.log('start - autovalue - environment - configuration'); + //console.log(this); + let that = this; + + if (that.isSet) { + let confGroups = that.value; + + let { + isMonitoringSupportedRes, + isListeningSupportedRes, + enable_monitoring, + listen + } = extractCalcEnvSupportedRelatedValues(that); + let dbNode = getDbNode(that); + let aci = extractValue('aci', that, dbNode); + + if (enable_monitoring && isMonitoringSupportedRes) { + if (! R.find(R.propEq('name', 'Monitoring'), confGroups)) { + confGroups = R.append(createNewConfGroup('Monitoring'), confGroups); + } + } else { + console.log('env - configurations - autovalue - monitoring not supported'); + confGroups = R.reject(R.propEq('name', 'Monitoring'), confGroups); + } + + if (listen && isListeningSupportedRes) { + if (! R.find(R.propEq('name', 'AMQP'), confGroups)) { + confGroups = R.append(createNewConfGroup('AMQP'), confGroups); + } + } else { + console.log('env - configurations - autovalue - listening not supported'); + confGroups = R.reject(R.propEq('name', 'AMQP'), confGroups); + } + + if (aci) { + if (! R.find(R.propEq('name', 'ACI'), confGroups)) { + confGroups = R.append(createNewConfGroup('ACI'), confGroups); + } + } else { + console.log('env - configurations - autovalue - aci not requested'); + confGroups = R.reject(R.propEq('name', 'ACI'), confGroups); + } + + confGroups = cleanOptionalGroups(confGroups, optionalConfGroups); + console.log('env - configurations - autovalue - after clean optional groups'); + + let newValue = R.map(function(confGroup) { + let schema = getSchemaForGroupName(confGroup.name); + return schema.clean(confGroup); + }, confGroups); + + console.log('end - autovalue - environment - configurations'); + console.log(newValue); + return newValue; + + } else { + console.log('env - configurations - autovalue - is not set'); + let newValue = R.map((confName) => { + let schema = getSchemaForGroupName(confName); + return schema.clean({}); + }, requiredConfGroups); + console.log('end - autovalue - environment - configurations'); + console.log(newValue); + return newValue; + } + }, + custom: function () { + console.log('start - custom - environment - configurations'); + //console.log(this); + let that = this; + let configurationGroups = that.value; + + let subErrors = []; + + let { + isMonitoringSupportedRes, + isListeningSupportedRes, + enable_monitoring, + listen + } = extractCalcEnvSupportedRelatedValues(that); + + let requiredConfGroupsTemp = R.clone(requiredConfGroups); + if (enable_monitoring && isMonitoringSupportedRes) { + requiredConfGroupsTemp = R.append('Monitoring', requiredConfGroupsTemp); + } + if (listen && isListeningSupportedRes) { + requiredConfGroupsTemp = R.append('AMQP', requiredConfGroupsTemp); + } + + console.log('env - configurations - custom - after mon & listen check'); + + let invalidResult = R.find(function(groupName) { + subErrors = checkGroup(groupName, configurationGroups, true); + if (subErrors.length > 0) { return true; } + return false; + }, requiredConfGroupsTemp); + + console.log(`env - configurations - custom - after require groups check`); + + if (R.isNil(invalidResult)) { + invalidResult = R.find(function(groupName) { + subErrors = checkGroup(groupName, configurationGroups, false); + if (subErrors.length > 0) { return true; } + return false; + }, optionalConfGroups); + } + + console.log(`env - configurations - custom - after optional groups check`); + + if (! R.isNil(invalidResult)) { + console.log(`env - configrations - custom - invalid result end: ${R.toString(subErrors)}`); + throw { + isError: true, + type: 'subGroupError', + data: subErrors, + message: constructSubGroupErrorMessage(subErrors) + }; + } + }, + + }, + user: { + type: String, + }, + distribution: { + type: String, + defaultValue: 'Mirantis-8.0', + custom: function () { + let that = this; + let constsDist = Constants.findOne({ name: 'distributions' }); + + if (R.isNil(constsDist.data)) { return 'notAllowed'; } + let distributions = constsDist.data; + + if (R.isNil(R.find(R.propEq('value', that.value), distributions))) { + return 'notAllowed'; + } + }, + }, + last_scanned: { + type: String, defaultValue: '' + }, + name: { + type: String, + defaultValue: 'MyEnvironmentName', + min: 6, + }, + type_drivers: { + type: String, + defaultValue: 'gre', + custom: function () { + let that = this; + let TypeDriversRec = Constants.findOne({ name: 'type_drivers' }); + + if (R.isNil(TypeDriversRec.data)) { return 'notAllowed'; } + let TypeDrivers = TypeDriversRec.data; + + if (R.isNil(R.find(R.propEq('value', that.value), TypeDrivers))) { + return 'notAllowed'; + } + }, + }, + + mechanism_drivers: { + type: [String], + defaultValue: ['ovs'], + minCount: 1, + custom: function () { + let that = this; + let consts = Constants.findOne({ name: 'mechanism_drivers' }); + + if (R.isNil(consts.data)) { return 'notAllowed'; } + let mechanismDrivers = consts.data; + + let result = R.find((driver) => { + if (R.find(R.propEq('value', driver), mechanismDrivers)) { + return false; + } + return true; + }, that.value); + + if (result) { return 'notAllowed'; } + + }, + }, + + operational: { + type: String, + allowedValues: ['stopped', 'running', 'error'], + defaultValue: 'stopped' + }, + + scanned: { type: Boolean, defaultValue: false }, + + type: { + type: String, + autoValue: function () { + return 'environment'; + }, + }, + + app_path: { + type: String, + autoValue: function () { + return '/home/scan/calipso_prod/app'; + } + }, + + listen: { + type: Boolean, + autoValue: function () { + console.log('env - listen - autoValue - start'); + let that = this; + let newValue = that.value; + console.log(`- current value: ${R.toString(newValue)}`); + + let { isListeningSupportedRes } = extractCalcEnvSupportedRelatedValues(that); + + if (!isListeningSupportedRes) { + console.log('* listening not supported'); + console.log(`* ${R.toString(isListeningSupportedRes)}`); + newValue = false; + } + + return newValue; + }, + }, + + enable_monitoring: { + type: Boolean, + autoValue: function () { + console.log('env - enable_monitoring - autoValue - start'); + let that = this; + let newValue = that.value; + console.log(`- current value: ${R.toString(newValue)}`); + + let { isMonitoringSupportedRes } = extractCalcEnvSupportedRelatedValues(that); + + if (!isMonitoringSupportedRes) { + console.log('* monitoring not supported'); + console.log(`* ${R.toString(isMonitoringSupportedRes)}`); + newValue = false; + } + + return newValue; + }, + }, + aci: { + type: Boolean, + defaultValue: false, + }, +}); + +/* +simpleSchema.addValidator(function () { + //let that = this; +}); +*/ + +// Bug in simple schema. cant add custom message to instance specific +// schema. +// https://github.com/aldeed/meteor-simple-schema/issues/559 +// Version 2 fixes it but it is rc. +//Environments.schema.messages({ +SimpleSchema.messages({ + confGroupInvalid: 'Configuration group is invalid.' +}); + +Environments.schema = simpleSchema; +Environments.attachSchema(Environments.schema); + +function getSchemaForGroupName(groupName) { + switch (groupName) { + case 'mysql': + return MysqlSchema; + case 'OpenStack': + return OpenStackSchema; + case 'CLI': + return CLISchema; + case 'AMQP': + return AMQPSchema; +// case 'NFV_provider': +// return NfvProviderSchema; + case 'ACI': + return AciSchema; + case 'Monitoring': + return MonitoringSchema; + default: + throw 'group name is not recognized. group: ' + groupName; + } +} + +function constructSubGroupErrorMessage(errors) { + let message = 'Validation errors on sub groups:'; + message = message + R.reduce((acc, item) => { + return acc + '\n- ' + item.group + ': ' + item.message; + }, '', errors); + + return message; +} + +function checkGroup(groupName, configurationGroups, groupRequired) { + let subErrors = []; + let confGroup = R.find(R.propEq('name', groupName), configurationGroups); + + if (R.isNil(confGroup)) { + if (groupRequired) { + subErrors = R.append({ + field: 'configuration', + group: groupName, + message: 'group ' + groupName + ' is required' + }, subErrors); + } + return subErrors; + } + + let validationContext = getSchemaForGroupName(groupName).newContext(); + + if (! validationContext.validate(confGroup)) { + subErrors = R.reduce(function (acc, invalidField) { + return R.append({ + field: invalidField, + group: groupName, + message: validationContext.keyErrorMessage(invalidField.name), + }, acc); + }, [], validationContext.invalidKeys()); + + return subErrors; + } + + return subErrors; +} + +export function createNewConfGroup(groupName) { + let schema = getSchemaForGroupName(groupName); + return schema.clean({}); +} + +function cleanOptionalGroups(confGroups, optionalConfGroups) { + return R.filter((conf) => { + if (R.contains(conf.name, optionalConfGroups)) { + return !isConfEmpty(conf); + } + + return true; + }, confGroups); +} + +function isConfEmpty(conf) { + return ! R.any((key) => { + if (key === 'name') { return false; } // We ignore the key 'name'. It is a 'type' key. + let val = conf[key]; + return ! ( R.isNil(val) || R.isEmpty(val)); + })(R.keys(conf)); +} + +function extractValue(name, schemaValidator, dbNode) { + console.log('env - extract value'); + console.log(`-name: ${R.toString(name)}`); + //console.log(`-schemaValidator: ${R.toString(schemaValidator)}`); + console.log(`-dbNode: ${R.toString(dbNode)}`); + + let field = schemaValidator.field(name); + let value = field.value; + + console.log(`extract value - schema value: ${R.toString(value)}`); + + if (R.isNil(field.value) && !field.isSet && dbNode) { + console.log(`extract value - db value: ${R.toString(dbNode[name])}`); + value = dbNode[name]; + } + + console.log(`extract value - result: ${R.toString(value)}`); + return value; +} + +function getDbNode(schemaHelper) { + let _id = R.defaultTo(schemaHelper.docId, R.path(['value'], schemaHelper.field('_id'))); + let dbNode = R.defaultTo(null, Environments.findOne({ _id: _id })); + return dbNode; +} + +function extractCalcEnvSupportedRelatedValues(schemaHelper) { + let dbNode = getDbNode(schemaHelper); + + let dist = extractValue('distribution', schemaHelper, dbNode); + let typeDrivers = extractValue('type_drivers', schemaHelper, dbNode); + let mechDrivers = extractValue('mechanism_drivers', schemaHelper, dbNode); + let enable_monitoring = extractValue('enable_monitoring', schemaHelper, dbNode); + let listen = extractValue('listen', schemaHelper, dbNode); + + let isMonitoringSupportedRes = isMonitoringSupported(dist, typeDrivers, mechDrivers); + let isListeningSupportedRes = isListeningSupported(dist, typeDrivers, mechDrivers); + + return { + enable_monitoring, + listen, + isMonitoringSupportedRes, + isListeningSupportedRes, + }; +} diff --git a/ui/imports/api/environments/methods.js b/ui/imports/api/environments/methods.js new file mode 100644 index 0000000..22a1e8b --- /dev/null +++ b/ui/imports/api/environments/methods.js @@ -0,0 +1,154 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others / +// / +// All rights reserved. This program and the accompanying materials / +// are made available under the terms of the Apache License, Version 2.0 / +// which accompanies this distribution, and is available at / +// http://www.apache.org/licenses/LICENSE-2.0 / +///////////////////////////////////////////////////////////////////////////////////////// +//import { Meteor } from 'meteor/meteor'; +import * as R from 'ramda'; +import { ValidatedMethod } from 'meteor/mdg:validated-method'; + +//import { SimpleSchema } from 'meteor/aldeed:simple-schema'; + +import { Environments } from './environments'; +import { Inventory } from '/imports/api/inventories/inventories'; +import { Links } from '/imports/api/links/links'; +import { Cliques } from '/imports/api/cliques/cliques'; +import { CliqueTypes } from '/imports/api/clique-types/clique-types'; +import { Messages } from '/imports/api/messages/messages'; +import { Scans } from '/imports/api/scans/scans'; +import { Roles } from 'meteor/alanning:roles'; + +export const insert = new ValidatedMethod({ + name: 'environments.insert', + validate: Environments.simpleSchema() + .pick([ + 'configuration', + 'configuration.$', + 'distribution', + 'name', + 'type_drivers', + 'mechanism_drivers', + 'mechanism_drivers.$', + 'listen', + 'enable_monitoring', + 'aci', + ]).validator({ clean: true, filter: false }), + //validate: null, + run({ + configuration, + distribution, + name, + type_drivers, + mechanism_drivers, + listen, + enable_monitoring, + aci, + }) { + // todo: create clean object instance. + let environment = Environments.schema.clean({ + user: Meteor.userId() + }); + + let auth = { + 'view-env': [ + Meteor.userId() + ], + 'edit-env': [ + Meteor.userId() + ] + }; + + environment = R.merge(environment, { + configuration, + distribution, + name, + type_drivers, + mechanism_drivers, + listen, + enable_monitoring, + auth, + aci, + }); + + Environments.insert(environment); + }, +}); + +export const update = new ValidatedMethod({ + name: 'environments.update', + validate: Environments.simpleSchema().pick([ + '_id', + 'configuration', + 'configuration.$', + //'distribution', + //'name', + 'type_drivers', + 'mechanism_drivers', + 'mechanism_drivers.$', + 'listen', + 'enable_monitoring', + 'aci', + ]).validator({ clean: true, filter: false }), + run({ + _id, + configuration, + //distribution, + //name, + type_drivers, + mechanism_drivers, + listen, + enable_monitoring, + aci, + }) { + let env = Environments.findOne({ _id: _id }); + + if (! Roles.userIsInRole(Meteor.userId(), 'edit-env', 'default-group')) { + if (! R.contains(Meteor.userId(), R.path(['auth', 'edit-env'], env) )) { + throw new Meteor.Error('not-auth', 'unauthorized for updating env'); + } + } + + Environments.update(_id, { + $set: { + configuration: configuration, + //distribution: distribution, + //name: name, + type_drivers, + mechanism_drivers, + listen, + enable_monitoring, + aci, + }, + }); + } +}); + +export const remove = new ValidatedMethod({ + name: 'environments.remove', + validate: Environments.simpleSchema().pick([ + '_id', + ]).validator({ clean: true, filter: false }), + run({ + _id, + }) { + const env = Environments.findOne({ _id: _id }); + console.log('environment for remove: ', env); + + if (! Roles.userIsInRole(Meteor.userId(), 'edit-env', 'default-group')) { + if (! R.contains(Meteor.userId(), R.path(['auth', 'edit-env'], env) )) { + throw new Meteor.Error('not-auth', 'unauthorized for updating env'); + } + } + + Inventory.remove({ environment: env.name }); + Links.remove({ environment: env.name }); + Cliques.remove({ environment: env.name }); + CliqueTypes.remove({ environment: env.name }); + Messages.remove({ environment: env.name }); + Scans.remove({ environment: env.name }); + Environments.remove({ _id: _id }); + } +}); diff --git a/ui/imports/api/environments/server/publications.js b/ui/imports/api/environments/server/publications.js new file mode 100644 index 0000000..667ee8e --- /dev/null +++ b/ui/imports/api/environments/server/publications.js @@ -0,0 +1,102 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others / +// / +// All rights reserved. This program and the accompanying materials / +// are made available under the terms of the Apache License, Version 2.0 / +// which accompanies this distribution, and is available at / +// http://www.apache.org/licenses/LICENSE-2.0 / +///////////////////////////////////////////////////////////////////////////////////////// +import { Meteor } from 'meteor/meteor'; +import * as R from 'ramda'; +import { Roles } from 'meteor/alanning:roles'; + +import { Environments } from '../environments.js'; + +Meteor.publish('environments_config', function () { + console.log('server subscribtion to: environments_config'); + let userId = this.userId; + + let query = { + type: 'environment', + }; + + if (! Roles.userIsInRole(userId, 'view-env', null)) { + query = R.merge(query, { + 'auth.view-env': { + $in: [ userId ] + } + }); + } + + console.log('-query: ', R.toString(query)); + return Environments.find(query); +}); + +const subsEnvViewEnvUserId = 'environments.view-env&userId'; +Meteor.publish(subsEnvViewEnvUserId, function (userId) { + console.log(`subscription - ${subsEnvViewEnvUserId} `); + console.log(`-userId: ${R.toString(userId)}`); + + let query = {}; + + let currentUser = this.userId; + if (! Roles.userIsInRole(currentUser, 'manage-users', Roles.GLOBAL_GROUP)) { + console.log(`* error: unauth`); + console.log(`- currentUser: ${R.toString(currentUser)}`); + this.error('unauthorized for this subscription'); + return; + } + + query = R.merge(query, { + 'auth.view-env': { + $in: [ userId ] + } + }); + + console.log(`* query: ${R.toString(query)}`); + return Environments.find(query); +}); + +const subsEnvEditEnvUserId = 'environments.edit-env&userId'; +Meteor.publish(subsEnvEditEnvUserId, function (userId) { + console.log(`subscription - ${subsEnvEditEnvUserId} `); + console.log(`-userId: ${R.toString(userId)}`); + let query = {}; + + let currentUser = this.userId; + if (! Roles.userIsInRole(currentUser, 'manage-users', Roles.GLOBAL_GROUP)) { + console.log(`* error: unauth`); + console.log(`- currentUser: ${R.toString(currentUser)}`); + this.error('unauthorized for this subscription'); + return; + } + + query = R.merge(query, { + 'auth.edit-env': { + $in: [ userId ] + } + }); + + console.log(`* query: ${R.toString(query)}`); + return Environments.find(query); +}); + +Meteor.publish('environments?name', function (name) { + console.log('server subscribtion to: environments?name=' + name.toString()); + let query = { + name: name, + user: this.userId + }; + return Environments.find(query); +}); + +Meteor.publish('environments?_id', function (_id) { + console.log('server subscribtion to: environments?_id'); + console.log('-_id: ', R.toString(_id)); + + let query = { + _id: _id, + user: this.userId + }; + return Environments.find(query); +}); |