Repository: ambari Updated Branches: refs/heads/trunk 5f4adaa6c -> 92b05b9ba
http://git-wip-us.apache.org/repos/asf/ambari/blob/11efa2f5/ambari-web/app/views/wizard/controls_view.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/wizard/controls_view.js b/ambari-web/app/views/wizard/controls_view.js deleted file mode 100644 index b0a26ab..0000000 --- a/ambari-web/app/views/wizard/controls_view.js +++ /dev/null @@ -1,1208 +0,0 @@ -/** - * 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'); - -/** - * Abstract view for config fields. - * Add popover support to control - */ -App.ServiceConfigPopoverSupport = Ember.Mixin.create({ - - /** - * Config object. It will instance of App.ServiceConfigProperty - */ - serviceConfig: null, - attributeBindings:['readOnly'], - isPopoverEnabled: true, - - didInsertElement: function () { - $('body').tooltip({ - selector: '[data-toggle=tooltip]', - placement: 'top' - }); - // if description for this serviceConfig not exist, then no need to show popover - if (this.get('isPopoverEnabled') !== 'false' && this.get('serviceConfig.description')) { - App.popover(this.$(), { - title: Em.I18n.t('installer.controls.serviceConfigPopover.title').format( - this.get('serviceConfig.displayName'), - (this.get('serviceConfig.displayName') == this.get('serviceConfig.name')) ? '' : this.get('serviceConfig.name') - ), - content: this.get('serviceConfig.description'), - placement: 'right', - trigger: 'hover' - }); - } - }, - - willDestroyElement: function() { - this.$().popover('destroy'); - }, - - readOnly: function () { - return !this.get('serviceConfig.isEditable'); - }.property('serviceConfig.isEditable') -}); - -/** - * mixin set class that serve as unique element identificator, - * id not used in order to avoid collision with ember ids - */ -App.ServiceConfigCalculateId = Ember.Mixin.create({ - idClass: Ember.computed(function () { - var label = Em.get(this, 'serviceConfig.name') ? Em.get(this, 'serviceConfig.name').toLowerCase().replace(/\./g, '-') : '', - fileName = Em.get(this, 'serviceConfig.filename') ? Em.get(this, 'serviceConfig.filename').toLowerCase().replace(/\./g, '-') : '', - group = Em.get(this, 'serviceConfig.group.name') || 'default'; - isOrigin = Em.get(this, 'serviceConfig.compareConfigs.length') > 0 ? '-origin' : ''; - return 'service-config-' + label + '-' + fileName + '-' + group + isOrigin; - }), - classNameBindings: 'idClass' -}); - -/** - * Default input control - * @type {*} - */ -App.ServiceConfigTextField = Ember.TextField.extend(App.ServiceConfigPopoverSupport, App.ServiceConfigCalculateId, { - - valueBinding: 'serviceConfig.value', - classNameBindings: 'textFieldClassName', - placeholderBinding: 'serviceConfig.defaultValue', - - keyPress: function (event) { - if (event.keyCode == 13) { - return false; - } - }, - //Set editDone true for last edited config text field parameter - focusOut: function (event) { - this.get('serviceConfig').set("editDone", true); - }, - //Set editDone false for all current category config text field parameter - focusIn: function (event) { - if (!this.get('serviceConfig.isOverridden') && !this.get('serviceConfig.isComparison')) { - this.get("parentView.categoryConfigsAll").setEach("editDone", false); - } - }, - - textFieldClassName: function () { - if (this.get('serviceConfig.unit')) { - return ['input-small']; - } else if (this.get('serviceConfig.displayType') === 'principal') { - return ['span12']; - } else { - return ['span9']; - } - }.property('serviceConfig.displayType', 'serviceConfig.unit') - -}); - -/** - * Customized input control with Units type specified - * @type {Em.View} - */ -App.ServiceConfigTextFieldWithUnit = Ember.View.extend(App.ServiceConfigPopoverSupport, { - valueBinding: 'serviceConfig.value', - classNames: ['input-append', 'with-unit'], - placeholderBinding: 'serviceConfig.defaultValue', - - templateName: require('templates/wizard/controls_service_config_textfield_with_unit') -}); - -/** - * Password control - * @type {*} - */ -App.ServiceConfigPasswordField = Ember.TextField.extend({ - - serviceConfig: null, - type: 'password', - attributeBindings:['readOnly'], - valueBinding: 'serviceConfig.value', - classNames: [ 'span4' ], - placeholder: Em.I18n.t('form.item.placeholders.typePassword'), - - template: Ember.Handlebars.compile('{{view view.retypePasswordView}}'), - - keyPress: function (event) { - if (event.keyCode == 13) { - return false; - } - }, - - retypePasswordView: Ember.TextField.extend({ - placeholder: Em.I18n.t('form.passwordRetype'), - attributeBindings:['readOnly'], - type: 'password', - classNames: [ 'span4', 'retyped-password' ], - keyPress: function (event) { - if (event.keyCode == 13) { - return false; - } - }, - valueBinding: 'parentView.serviceConfig.retypedPassword', - readOnly: function () { - return !this.get('parentView.serviceConfig.isEditable'); - }.property('parentView.serviceConfig.isEditable') - }), - - readOnly: function () { - return !this.get('serviceConfig.isEditable'); - }.property('serviceConfig.isEditable') - -}); - -/** - * Textarea control - * @type {*} - */ -App.ServiceConfigTextArea = Ember.TextArea.extend(App.ServiceConfigPopoverSupport, App.ServiceConfigCalculateId, { - - valueBinding: 'serviceConfig.value', - rows: 4, - classNames: ['span9', 'directories'] -}); - -/** - * Textarea control for content type - * @type {*} - */ -App.ServiceConfigTextAreaContent = Ember.TextArea.extend(App.ServiceConfigPopoverSupport, App.ServiceConfigCalculateId, { - - valueBinding: 'serviceConfig.value', - rows: 20, - classNames: ['span10'] -}); - -/** - * Textarea control with bigger height - * @type {*} - */ -App.ServiceConfigBigTextArea = App.ServiceConfigTextArea.extend(App.ServiceConfigCalculateId, { - rows: 10 -}); - -/** - * Checkbox control - * @type {*} - */ -App.ServiceConfigCheckbox = Ember.Checkbox.extend(App.ServiceConfigPopoverSupport, App.ServiceConfigCalculateId, { - - checkedBinding: 'serviceConfig.value', - - disabled: function () { - return !this.get('serviceConfig.isEditable'); - }.property('serviceConfig.isEditable') -}); - -App.ServiceConfigRadioButtons = Ember.View.extend(App.ServiceConfigCalculateId, { - templateName: require('templates/wizard/controls_service_config_radio_buttons'), - - didInsertElement: function () { - // on page render, automatically populate JDBC URLs only for default database settings - // so as to not lose the user's customizations on these fields - if (['addServiceController', 'installerController'].contains(this.get('controller.wizardController.name'))) { - if (/^New\s\w+\sDatabase$/.test(this.get('serviceConfig.value'))) { - this.onOptionsChange(); - } else { - this.handleDBConnectionProperty(); - } - } - }, - - configs: function () { - if (this.get('controller.name') == 'mainServiceInfoConfigsController') return this.get('categoryConfigsAll'); - return this.get('categoryConfigsAll').filterProperty('isObserved', true); - }.property('categoryConfigsAll'), - - serviceConfig: null, - categoryConfigsAll: null, - - onOptionsChange: function () { - // The following if condition will be satisfied only for installer wizard flow - if (this.get('configs').length) { - var connectionUrl = this.get('connectionUrl'); - var dbClass = this.get('dbClass'); - if (connectionUrl) { - if (this.get('serviceConfig.serviceName') === 'HIVE') { - var hiveDbType = this.get('parentView.serviceConfigs').findProperty('name', 'hive_database_type'); - switch (this.get('serviceConfig.value')) { - case 'New MySQL Database': - case 'Existing MySQL Database': - connectionUrl.set('value', "jdbc:mysql://" + this.get('hostName') + "/" + this.get('databaseName') + "?createDatabaseIfNotExist=true"); - dbClass.set('value', "com.mysql.jdbc.Driver"); - Em.set(hiveDbType, 'value', 'mysql'); - break; - case Em.I18n.t('services.service.config.hive.oozie.postgresql'): - connectionUrl.set('value', "jdbc:postgresql://" + this.get('hostName') + ":5432/" + this.get('databaseName')); - dbClass.set('value', "org.postgresql.Driver"); - Em.set(hiveDbType, 'value', 'postgres'); - break; - case 'Existing Oracle Database': - connectionUrl.set('value', "jdbc:oracle:thin:@//" + this.get('hostName') + ":1521/" + this.get('databaseName')); - dbClass.set('value', "oracle.jdbc.driver.OracleDriver"); - Em.set(hiveDbType, 'value', 'oracle'); - break; - case 'Existing MSSQL Server database with SQL authentication': - connectionUrl.set('value', "jdbc:sqlserver://" + this.get('hostName') + ";databaseName=" + this.get('databaseName')); - dbClass.set('value', "com.microsoft.sqlserver.jdbc.SQLServerDriver"); - Em.set(hiveDbType, 'value', 'mssql'); - break; - case 'Existing MSSQL Server database with integrated authentication': - connectionUrl.set('value', "jdbc:sqlserver://" + this.get('hostName') + ";databaseName=" + this.get('databaseName') + ";integratedSecurity=true"); - dbClass.set('value', "com.microsoft.sqlserver.jdbc.SQLServerDriver"); - Em.set(hiveDbType, 'value', 'mssql'); - break; - } - var isNotExistingMySQLServer = this.get('serviceConfig.value') !== 'Existing MSSQL Server database with integrated authentication'; - this.get('categoryConfigsAll').findProperty('name', 'javax.jdo.option.ConnectionUserName').setProperties({ - isVisible: isNotExistingMySQLServer, - isRequired: isNotExistingMySQLServer - }); - this.get('categoryConfigsAll').findProperty('name', 'javax.jdo.option.ConnectionPassword').setProperties({ - isVisible: isNotExistingMySQLServer, - isRequired: isNotExistingMySQLServer - }); - } else if (this.get('serviceConfig.serviceName') === 'OOZIE') { - switch (this.get('serviceConfig.value')) { - case 'New Derby Database': - connectionUrl.set('value', "jdbc:derby:${oozie.data.dir}/${oozie.db.schema.name}-db;create=true"); - dbClass.set('value', "org.apache.derby.jdbc.EmbeddedDriver"); - break; - case 'Existing MySQL Database': - connectionUrl.set('value', "jdbc:mysql://" + this.get('hostName') + "/" + this.get('databaseName')); - dbClass.set('value', "com.mysql.jdbc.Driver"); - break; - case Em.I18n.t('services.service.config.hive.oozie.postgresql'): - connectionUrl.set('value', "jdbc:postgresql://" + this.get('hostName') + ":5432/" + this.get('databaseName')); - dbClass.set('value', "org.postgresql.Driver"); - break; - case 'Existing Oracle Database': - connectionUrl.set('value', "jdbc:oracle:thin:@//" + this.get('hostName') + ":1521/" + this.get('databaseName')); - dbClass.set('value', "oracle.jdbc.driver.OracleDriver"); - break; - case 'Existing MSSQL Server database with SQL authentication': - connectionUrl.set('value', "jdbc:sqlserver://" + this.get('hostName') + ";databaseName=" + this.get('databaseName')); - dbClass.set('value', "com.microsoft.sqlserver.jdbc.SQLServerDriver"); - break; - case 'Existing MSSQL Server database with integrated authentication': - connectionUrl.set('value', "jdbc:sqlserver://" + this.get('hostName') + ";databaseName=" + this.get('databaseName') + ";integratedSecurity=true"); - dbClass.set('value', "com.microsoft.sqlserver.jdbc.SQLServerDriver"); - break; - } - isNotExistingMySQLServer = this.get('serviceConfig.value') !== 'Existing MSSQL Server database with integrated authentication'; - this.get('categoryConfigsAll').findProperty('name', 'oozie.service.JPAService.jdbc.username').setProperties({ - isVisible: isNotExistingMySQLServer, - isRequired: isNotExistingMySQLServer - }); - this.get('categoryConfigsAll').findProperty('name', 'oozie.service.JPAService.jdbc.password').setProperties({ - isVisible: isNotExistingMySQLServer, - isRequired: isNotExistingMySQLServer - }); - } - connectionUrl.set('defaultValue', connectionUrl.get('value')); - } - } - }.observes('databaseName', 'hostName'), - - nameBinding: 'serviceConfig.radioName', - - databaseNameProperty: function () { - switch (this.get('serviceConfig.serviceName')) { - case 'HIVE': - return this.get('categoryConfigsAll').findProperty('name', 'ambari.hive.db.schema.name'); - case 'OOZIE': - return this.get('categoryConfigsAll').findProperty('name', 'oozie.db.schema.name'); - default: - return null; - } - }.property('serviceConfig.serviceName'), - - databaseName: function () { - return this.get('databaseNameProperty.value'); - }.property('databaseNameProperty.value'), - - hostNameProperty: function () { - var value = this.get('serviceConfig.value'); - var returnValue; - var hostname; - if (this.get('serviceConfig.serviceName') === 'HIVE') { - switch (value) { - case 'New MySQL Database': - hostname = this.get('categoryConfigsAll').findProperty('name', 'hive_ambari_host'); - break; - case 'Existing MySQL Database': - hostname = this.get('categoryConfigsAll').findProperty('name', 'hive_existing_mysql_host'); - break; - case Em.I18n.t('services.service.config.hive.oozie.postgresql'): - hostname = this.get('categoryConfigsAll').findProperty('name', 'hive_existing_postgresql_host'); - break; - case 'Existing Oracle Database': - hostname = this.get('categoryConfigsAll').findProperty('name', 'hive_existing_oracle_host'); - break; - case 'Existing MSSQL Server database with SQL authentication': - hostname = this.get('categoryConfigsAll').findProperty('name', 'hive_existing_mssql_server_host'); - break; - case 'Existing MSSQL Server database with integrated authentication': - hostname = this.get('categoryConfigsAll').findProperty('name', 'hive_existing_mssql_server_2_host'); - break; - } - if (hostname) { - returnValue = hostname; - } else { - returnValue = this.get('categoryConfigsAll').findProperty('name', 'hive_hostname'); - } - } else if (this.get('serviceConfig.serviceName') === 'OOZIE') { - switch (value) { - case 'New Derby Database': - hostname = this.get('categoryConfigsAll').findProperty('name', 'oozie_ambari_host'); - break; - case 'Existing MySQL Database': - hostname = this.get('categoryConfigsAll').findProperty('name', 'oozie_existing_mysql_host'); - break; - case Em.I18n.t('services.service.config.hive.oozie.postgresql'): - hostname = this.get('categoryConfigsAll').findProperty('name', 'oozie_existing_postgresql_host'); - break; - case 'Existing Oracle Database': - hostname = this.get('categoryConfigsAll').findProperty('name', 'oozie_existing_oracle_host'); - break; - case 'Existing MSSQL Server database with SQL authentication': - hostname = this.get('categoryConfigsAll').findProperty('name', 'oozie_existing_mssql_server_host'); - break; - case 'Existing MSSQL Server database with integrated authentication': - hostname = this.get('categoryConfigsAll').findProperty('name', 'oozie_existing_mssql_server_2_host'); - break; - } - if (hostname) { - returnValue = hostname; - } else { - returnValue = this.get('categoryConfigsAll').findProperty('name', 'oozie_hostname'); - } - } - return returnValue; - }.property('serviceConfig.serviceName', 'serviceConfig.value'), - - hostName: function () { - return this.get('hostNameProperty.value'); - }.property('hostNameProperty.value'), - - connectionUrl: function () { - if (this.get('serviceConfig.serviceName') === 'HIVE') { - return this.get('categoryConfigsAll').findProperty('name', 'javax.jdo.option.ConnectionURL'); - } else { - return this.get('categoryConfigsAll').findProperty('name', 'oozie.service.JPAService.jdbc.url'); - } - }.property('serviceConfig.serviceName'), - - dbClass: function () { - if (this.get('serviceConfig.serviceName') === 'HIVE') { - return this.get('categoryConfigsAll').findProperty('name', 'javax.jdo.option.ConnectionDriverName'); - } else { - return this.get('categoryConfigsAll').findProperty('name', 'oozie.service.JPAService.jdbc.driver'); - } - }.property('serviceConfig.serviceName'), - - /** - * `Observer` that add <code>additionalView</code> to <code>App.ServiceConfigProperty</code> - * that responsible for (if existing db selected) - * 1. checking database connection - * 2. showing jdbc driver setup warning msg. - * - * @method handleDBConnectionProperty - **/ - handleDBConnectionProperty: function() { - var handledProperties = ['oozie_database', 'hive_database']; - var currentValue = this.get('serviceConfig.value'); - var databases = /MySQL|PostgreSQL|Oracle|Derby|MSSQL/gi; - var currentDB = currentValue.match(databases)[0]; - var databasesTypes = /MySQL|PostgreS|Oracle|Derby|MSSQL/gi; - var currentDBType = currentValue.match(databasesTypes)[0]; - var existingDatabase = /existing/gi.test(currentValue); - // db connection check button show up if existed db selected - var propertyAppendTo1 = this.get('categoryConfigsAll').findProperty('displayName', 'Database URL'); - if (currentDB && existingDatabase) { - if (handledProperties.contains(this.get('serviceConfig.name'))) { - if (propertyAppendTo1) propertyAppendTo1.set('additionalView', App.CheckDBConnectionView.extend({databaseName: currentDB})); - } - } else { - propertyAppendTo1.set('additionalView', null); - } - // warning msg under database type radio buttons, to warn the user to setup jdbc driver if existed db selected - var propertyHive = this.get('categoryConfigsAll').findProperty('displayName', 'Hive Database'); - var propertyOozie = this.get('categoryConfigsAll').findProperty('displayName', 'Oozie Database'); - var propertyAppendTo2 = propertyHive ? propertyHive : propertyOozie; - if (currentDB && existingDatabase) { - if (handledProperties.contains(this.get('serviceConfig.name'))) { - if (propertyAppendTo2) { - propertyAppendTo2.set('additionalView', Ember.View.extend({ - template: Ember.Handlebars.compile('<div class="alert">{{{view.message}}}</div>'), - message: Em.I18n.t('services.service.config.database.msg.jdbcSetup').format(currentDBType.toLowerCase(), currentDBType.toLowerCase()) - })); - } - } - } else { - propertyAppendTo2.set('additionalView', null); - } - }.observes('serviceConfig.value'), - - optionsBinding: 'serviceConfig.options' -}); - -App.ServiceConfigRadioButton = Ember.Checkbox.extend({ - tagName: 'input', - attributeBindings: ['type', 'name', 'value', 'checked', 'disabled'], - checked: false, - type: 'radio', - name: null, - value: null, - - didInsertElement: function () { - console.debug('App.ServiceConfigRadioButton.didInsertElement'); - if (this.get('parentView.serviceConfig.value') === this.get('value')) { - console.debug(this.get('name') + ":" + this.get('value') + ' is checked'); - this.set('checked', true); - } - }, - - click: function () { - this.set('checked', true); - console.debug('App.ServiceConfigRadioButton.click'); - this.onChecked(); - }, - - onChecked: function () { - // Wrapping the call with Ember.run.next prevents a problem where setting isVisible on component - // causes JS error due to re-rendering. For example, this occurs when switching the Config Group - // in Service Config page - Em.run.next(this, function() { - console.debug('App.ServiceConfigRadioButton.onChecked'); - this.set('parentView.serviceConfig.value', this.get('value')); - var components = this.get('parentView.serviceConfig.options'); - if (components) { - components.forEach(function (_component) { - if (_component.foreignKeys) { - _component.foreignKeys.forEach(function (_componentName) { - if (this.get('parentView.categoryConfigsAll').someProperty('name', _componentName)) { - var component = this.get('parentView.categoryConfigsAll').findProperty('name', _componentName); - component.set('isVisible', _component.displayName === this.get('value')); - } - }, this); - } - }, this); - } - }); - }.observes('checked'), - - disabled: function () { - return !this.get('parentView.serviceConfig.isEditable') || - !['addServiceController', 'installerController'].contains(this.get('controller.wizardController.name')) && /^New\s\w+\sDatabase$/.test(this.get('value')); - }.property('parentView.serviceConfig.isEditable') -}); - -App.ServiceConfigComboBox = Ember.Select.extend(App.ServiceConfigPopoverSupport, App.ServiceConfigCalculateId, { - contentBinding: 'serviceConfig.options', - selectionBinding: 'serviceConfig.value', - placeholderBinding: 'serviceConfig.defaultValue', - classNames: [ 'span3' ] -}); - - -/** - * Base component for host config with popover support - */ -App.ServiceConfigHostPopoverSupport = Ember.Mixin.create({ - - /** - * Config object. It will instance of App.ServiceConfigProperty - */ - serviceConfig: null, - - didInsertElement: function () { - App.popover(this.$(), { - title: this.get('serviceConfig.displayName'), - content: this.get('serviceConfig.description'), - placement: 'right', - trigger: 'hover' - }); - } -}); - -/** - * Master host component. - * Show hostname without ability to edit it - * @type {*} - */ -App.ServiceConfigMasterHostView = Ember.View.extend(App.ServiceConfigHostPopoverSupport, App.ServiceConfigCalculateId, { - - classNames: ['master-host', 'span6'], - valueBinding: 'serviceConfig.value', - - template: Ember.Handlebars.compile('{{value}}') - -}); - -/** - * text field property view that enables possibility - * for check connectio - * @type {*} - */ -App.checkConnectionView = App.ServiceConfigTextField.extend({ - didInsertElement: function() { - this._super(); - var kdc = this.get('categoryConfigsAll').findProperty('name', 'kdc_type'); - var propertyAppendTo = this.get('categoryConfigsAll').findProperty('name', 'admin_password'); - if (propertyAppendTo) propertyAppendTo.set('additionalView', App.CheckDBConnectionView.extend({databaseName: kdc && kdc.get('value')})); - } -}); - -/** - * Show value as plain label in italics - * @type {*} - */ -App.ServiceConfigLabelView = Ember.View.extend(App.ServiceConfigHostPopoverSupport, App.ServiceConfigCalculateId, { - - classNames: ['master-host', 'span6'], - valueBinding: 'serviceConfig.value', - - template: Ember.Handlebars.compile('<i>{{view.value}}</i>') -}); - -/** - * Base component to display Multiple hosts - * @type {*} - */ -App.ServiceConfigMultipleHostsDisplay = Ember.Mixin.create(App.ServiceConfigHostPopoverSupport, App.ServiceConfigCalculateId, { - - hasNoHosts: function () { - console.log('view', this.get('viewName')); //to know which View cause errors - console.log('controller', this.get('controller').name); //should be slaveComponentGroupsController - if (!this.get('value')) { - return true; - } - return this.get('value').length === 0; - }.property('value'), - - hasOneHost: function () { - return this.get('value').length === 1; - }.property('value'), - - hasMultipleHosts: function () { - return this.get('value').length > 1; - }.property('value'), - - otherLength: function () { - var len = this.get('value').length; - if (len > 2) { - return Em.I18n.t('installer.controls.serviceConfigMultipleHosts.others').format(len - 1); - } else { - return Em.I18n.t('installer.controls.serviceConfigMultipleHosts.other'); - } - }.property('value') - -}); - - -/** - * Multiple master host component. - * Show hostnames without ability to edit it - * @type {*} - */ -App.ServiceConfigMasterHostsView = Ember.View.extend(App.ServiceConfigMultipleHostsDisplay, App.ServiceConfigCalculateId, { - - viewName: "serviceConfigMasterHostsView", - valueBinding: 'serviceConfig.value', - - classNames: ['master-hosts', 'span6'], - templateName: require('templates/wizard/master_hosts'), - - /** - * Onclick handler for link - */ - showHosts: function () { - var serviceConfig = this.get('serviceConfig'); - App.ModalPopup.show({ - header: Em.I18n.t('installer.controls.serviceConfigMasterHosts.header').format(serviceConfig.category), - bodyClass: Ember.View.extend({ - serviceConfig: serviceConfig, - templateName: require('templates/wizard/master_hosts_popup') - }), - secondary: null - }); - } - -}); - -/** - * Show tabs list for slave hosts - * @type {*} - */ -App.SlaveComponentGroupsMenu = Em.CollectionView.extend(App.ServiceConfigCalculateId, { - - content: function () { - return this.get('controller.componentGroups'); - }.property('controller.componentGroups'), - - tagName: 'ul', - classNames: ["nav", "nav-tabs"], - - itemViewClass: Em.View.extend({ - classNameBindings: ["active"], - - active: function () { - return this.get('content.active'); - }.property('content.active'), - - errorCount: function () { - return this.get('content.properties').filterProperty('isValid', false).filterProperty('isVisible', true).get('length'); - }.property('content.properties.@each.isValid', 'content.properties.@each.isVisible'), - - templateName: require('templates/wizard/controls_slave_component_groups_menu') - }) - -}); - -/** - * <code>Add group</code> button - * @type {*} - */ -App.AddSlaveComponentGroupButton = Ember.View.extend(App.ServiceConfigCalculateId, { - - tagName: 'span', - slaveComponentName: null, - - didInsertElement: function () { - App.popover(this.$(), { - title: Em.I18n.t('installer.controls.addSlaveComponentGroupButton.title').format(this.get('slaveComponentName')), - content: Em.I18n.t('installer.controls.addSlaveComponentGroupButton.content').format(this.get('slaveComponentName'), this.get('slaveComponentName'), this.get('slaveComponentName')), - placement: 'right', - trigger: 'hover' - }); - } - -}); - -/** - * Multiple Slave Hosts component - * @type {*} - */ -App.ServiceConfigSlaveHostsView = Ember.View.extend(App.ServiceConfigMultipleHostsDisplay, App.ServiceConfigCalculateId, { - - viewName: 'serviceConfigSlaveHostsView', - - classNames: ['slave-hosts', 'span6'], - - valueBinding: 'serviceConfig.value', - - templateName: require('templates/wizard/slave_hosts'), - - /** - * Onclick handler for link - */ - showHosts: function () { - var serviceConfig = this.get('serviceConfig'); - App.ModalPopup.show({ - header: Em.I18n.t('installer.controls.serviceConfigMasterHosts.header').format(serviceConfig.category), - bodyClass: Ember.View.extend({ - serviceConfig: serviceConfig, - templateName: require('templates/wizard/master_hosts_popup') - }), - secondary: null - }); - } - -}); - -/** - * properties for present active slave group - * @type {*} - */ -App.SlaveGroupPropertiesView = Ember.View.extend(App.ServiceConfigCalculateId, { - - viewName: 'serviceConfigSlaveHostsView', - - group: function () { - return this.get('controller.activeGroup'); - }.property('controller.activeGroup'), - - groupConfigs: function () { - console.log("************************************************************************"); - console.log("The value of group is: " + this.get('group')); - console.log("************************************************************************"); - return this.get('group.properties'); - }.property('group.properties.@each').cacheable(), - - errorCount: function () { - return this.get('group.properties').filterProperty('isValid', false).filterProperty('isVisible', true).get('length'); - }.property('configs.@each.isValid', 'configs.@each.isVisible') -}); - -/** - * DropDown component for <code>select hosts for groups</code> popup - * @type {*} - */ -App.SlaveComponentDropDownGroupView = Ember.View.extend(App.ServiceConfigCalculateId, { - - viewName: "slaveComponentDropDownGroupView", - - /** - * On change handler for <code>select hosts for groups</code> popup - * @param event - */ - changeGroup: function (event) { - var host = this.get('content'); - var groupName = $('#' + this.get('elementId') + ' select').val(); - this.get('controller').changeHostGroup(host, groupName); - }, - - optionTag: Ember.View.extend({ - - /** - * Whether current value(OptionTag value) equals to host value(assigned to SlaveComponentDropDownGroupView.content) - */ - selected: function () { - return this.get('parentView.content.group') === this.get('content'); - }.property('content') - }) -}); - -/** - * Show info about current group - * @type {*} - */ -App.SlaveComponentChangeGroupNameView = Ember.View.extend(App.ServiceConfigCalculateId, { - - contentBinding: 'controller.activeGroup', - classNames: ['control-group'], - classNameBindings: 'error', - error: false, - setError: function () { - this.set('error', false); - }.observes('controller.activeGroup'), - errorMessage: function () { - return this.get('error') ? Em.I18n.t('installer.controls.slaveComponentChangeGroupName.error') : ''; - }.property('error'), - - /** - * Onclick handler for saving updated group name - * @param event - */ - changeGroupName: function (event) { - var inputVal = $('#' + this.get('elementId') + ' input[type="text"]').val(); - if (inputVal !== this.get('content.name')) { - var result = this.get('controller').changeSlaveGroupName(this.get('content'), inputVal); - this.set('error', result); - } - } -}); -/** - * View for testing connection to database. - **/ -App.CheckDBConnectionView = Ember.View.extend({ - templateName: require('templates/common/form/check_db_connection'), - /** @property {string} btnCaption - text for button **/ - btnCaption: Em.I18n.t('services.service.config.database.btn.idle'), - /** @property {string} responseCaption - text for status link **/ - responseCaption: null, - /** @property {boolean} isConnecting - is request to server activated **/ - isConnecting: false, - /** @property {boolean} isValidationPassed - check validation for required fields **/ - isValidationPassed: null, - /** @property {string} databaseName- name of current database **/ - databaseName: null, - /** @property {boolean} isRequestResolved - check for finished request to server **/ - isRequestResolved: false, - /** @property {boolean} isConnectionSuccess - check for successful connection to database **/ - isConnectionSuccess: null, - /** @property {string} responseFromServer - message from server response **/ - responseFromServer: null, - /** @property {Object} ambariRequiredProperties - properties that need for custom action request **/ - ambariRequiredProperties: null, - /** @property {Number} currentRequestId - current custom action request id **/ - currentRequestId: null, - /** @property {Number} currentTaskId - current custom action task id **/ - currentTaskId: null, - /** @property {jQuery.Deferred} request - current $.ajax request **/ - request: null, - /** @property {Number} pollInterval - timeout interval for ajax polling **/ - pollInterval: 3000, - /** @property {string} hostNameProperty - host name property based on service and database names **/ - hostNameProperty: function() { - if (!/wizard/i.test(this.get('controller.name')) && this.get('parentView.service.serviceName') === 'HIVE') { - return this.get('parentView.service.serviceName').toLowerCase() + '_hostname'; - } else if (this.get('parentView.service.serviceName') === 'KERBEROS') { - return 'kdc_host'; - } - return '{0}_existing_{1}_host'.format(this.get('parentView.service.serviceName').toLowerCase(), this.get('databaseName').toLowerCase()); - }.property('databaseName'), - /** @property {boolean} isBtnDisabled - disable button on failed validation or active request **/ - isBtnDisabled: function() { - return !this.get('isValidationPassed') || this.get('isConnecting'); - }.property('isValidationPassed', 'isConnecting'), - /** @property {object} requiredProperties - properties that necessary for database connection **/ - requiredProperties: function() { - var propertiesMap = { - OOZIE: ['oozie.db.schema.name','oozie.service.JPAService.jdbc.username','oozie.service.JPAService.jdbc.password','oozie.service.JPAService.jdbc.driver','oozie.service.JPAService.jdbc.url'], - HIVE: ['ambari.hive.db.schema.name','javax.jdo.option.ConnectionUserName','javax.jdo.option.ConnectionPassword','javax.jdo.option.ConnectionDriverName','javax.jdo.option.ConnectionURL'], - KERBEROS: ['kdc_host'] - }; - return propertiesMap[this.get('parentView.service.serviceName')]; - }.property(), - /** @property {Object} propertiesPattern - check pattern according to type of connection properties **/ - propertiesPattern: function() { - var patterns = { - db_connection_url: /jdbc\.url|connectionurl|kdc_host/ig - }; - if (this.get('parentView.service.serviceName') != "KERBEROS") { - patterns.user_name = /(username|dblogin)$/ig; - patterns.user_passwd = /(dbpassword|password)$/ig; - } - return patterns; - }.property('parentView.service.serviceName'), - /** @property {String} masterHostName - host name location of Master Component related to Service **/ - masterHostName: function() { - var serviceMasterMap = { - 'OOZIE': 'oozieserver_host', - 'HDFS': 'hadoop_host', - 'HIVE': 'hive_ambari_host', - 'KERBEROS': 'kdc_host' - }; - return this.get('parentView.categoryConfigsAll').findProperty('name', serviceMasterMap[this.get('parentView.service.serviceName')]).get('value'); - }.property('parentView.service.serviceName', 'parentView.categoryConfigsAll.@each.value'), - /** @property {Object} connectionProperties - service specific config values mapped for custom action request **/ - connectionProperties: function() { - var propObj = {}; - for (var key in this.get('propertiesPattern')) { - propObj[key] = this.getConnectionProperty(this.get('propertiesPattern')[key]); - } - return propObj; - }.property('parentView.categoryConfigsAll.@each.value'), - /** - * Properties that stores in local storage used for handling - * last success connection. - * - * @property {Object} preparedDBProperties - **/ - preparedDBProperties: function() { - var propObj = {}; - for (var key in this.get('propertiesPattern')) { - var propName = this.getConnectionProperty(this.get('propertiesPattern')[key], true); - propObj[propName] = this.get('parentView.categoryConfigsAll').findProperty('name', propName).get('value'); - } - return propObj; - }.property(), - /** Check validation and load ambari properties **/ - didInsertElement: function() { - var kdc = this.get('parentView.categoryConfigsAll').findProperty('name', 'kdc_type'); - if (kdc) { - var name = kdc.get('value') == 'Existing MIT KDC' ? 'KDC' : 'AD'; - App.popover(this.$(), { - title: Em.I18n.t('services.service.config.database.btn.idle'), - content: Em.I18n.t('installer.controls.checkConnection.popover').format(name), - placement: 'right', - trigger: 'hover' - }); - } - this.handlePropertiesValidation(); - this.getAmbariProperties(); - }, - /** On view destroy **/ - willDestroyElement: function() { - this.set('isConnecting', false); - this._super(); - }, - /** - * Observer that take care about enabling/disabling button based on required properties validation. - * - * @method handlePropertiesValidation - **/ - handlePropertiesValidation: function() { - this.restore(); - var isValid = true; - var properties = [].concat(this.get('requiredProperties')); - properties.push(this.get('hostNameProperty')); - properties.forEach(function(propertyName) { - var property = this.get('parentView.categoryConfigsAll').findProperty('name', propertyName); - if(property && !property.get('isValid')) isValid = false; - }, this); - this.set('isValidationPassed', isValid); - }.observes('parentView.categoryConfigsAll.@each.isValid', 'parentView.categoryConfigsAll.@each.value', 'databaseName'), - - getConnectionProperty: function(regexp, isGetName) { - var _this = this; - var propertyName = _this.get('requiredProperties').filter(function(item) { - return regexp.test(item); - })[0]; - return (isGetName) ? propertyName : _this.get('parentView.categoryConfigsAll').findProperty('name', propertyName).get('value'); - }, - /** - * Set up ambari properties required for custom action request - * - * @method getAmbariProperties - **/ - getAmbariProperties: function() { - var clusterController = App.router.get('clusterController'); - var _this = this; - if (!App.isEmptyObject(App.db.get('tmp', 'ambariProperties')) && !this.get('ambariProperties')) { - this.set('ambariProperties', App.db.get('tmp', 'ambariProperties')); - return; - } - if (App.isEmptyObject(clusterController.get('ambariProperties'))) { - clusterController.loadAmbariProperties().done(function(data) { - _this.formatAmbariProperties(data.RootServiceComponents.properties); - }); - } else { - this.formatAmbariProperties(clusterController.get('ambariProperties')); - } - }, - - formatAmbariProperties: function(properties) { - var defaults = { - threshold: "60", - ambari_server_host: location.hostname, - check_execute_list : "db_connection_check" - }; - var properties = App.permit(properties, ['jdk.name','jdk_location','java.home']); - var renameKey = function(oldKey, newKey) { - if (properties[oldKey]) { - defaults[newKey] = properties[oldKey]; - delete properties[oldKey]; - } - }; - renameKey('java.home', 'java_home'); - renameKey('jdk.name', 'jdk_name'); - $.extend(properties, defaults); - App.db.set('tmp', 'ambariProperties', properties); - this.set('ambariProperties', properties); - }, - /** - * `Action` method for starting connect to current database. - * - * @method connectToDatabase - **/ - connectToDatabase: function() { - if (this.get('isBtnDisabled')) return; - this.set('isRequestResolved', false); - App.db.set('tmp', this.get('parentView.service.serviceName') + '_connection', {}); - this.setConnectingStatus(true); - if (App.get('testMode')) { - this.startPolling(); - } else { - this.runCheckConnection(); - } - }, - - /** - * runs check connections methods depending on service - * @return {void} - * @method runCheckConnection - */ - runCheckConnection: function() { - if (this.get('parentView.service.serviceName') === 'KERBEROS') { - this.runKDCCheck(); - } else { - this.createCustomAction(); - } - }, - - /** - * send ajax request to perforn kdc host check - * @return {App.ajax} - * @method runKDCCheck - */ - runKDCCheck: function() { - return App.ajax.send({ - name: 'admin.kerberos_security.test_connection', - sender: this, - data: { - kdcHostname: this.get('masterHostName') - }, - success: 'onRunKDCCheckSuccess', - error: 'onCreateActionError' - }); - }, - - /** - * - * @param data - */ - onRunKDCCheckSuccess: function(data) { - var statusCode = { - success: 'REACHABLE', - failed: 'UNREACHABLE' - }; - if (data == statusCode['success']) { - this.setResponseStatus('success'); - } else { - this.setResponseStatus('failed'); - } - this.set('responseFromServer', data); - }, - - /** - * Run custom action for database connection. - * - * @method createCustomAction - **/ - createCustomAction: function() { - var dbName = this.get('databaseName').toLowerCase() === 'postgresql' ? 'postgres' : this.get('databaseName').toLowerCase(); - var params = $.extend(true, {}, { db_name: dbName }, this.get('connectionProperties'), this.get('ambariProperties')); - App.ajax.send({ - name: 'custom_action.create', - sender: this, - data: { - requestInfo: { - parameters: params - }, - filteredHosts: [this.get('masterHostName')] - }, - success: 'onCreateActionSuccess', - error: 'onCreateActionError' - }); - }, - /** - * Run updater if task is created successfully. - * - * @method onConnectActionS - **/ - onCreateActionSuccess: function(data) { - this.set('currentRequestId', data.Requests.id); - App.ajax.send({ - name: 'custom_action.request', - sender: this, - data: { - requestId: this.get('currentRequestId') - }, - success: 'setCurrentTaskId' - }); - }, - - setCurrentTaskId: function(data) { - this.set('currentTaskId', data.items[0].Tasks.id); - this.startPolling(); - }, - - startPolling: function() { - if (this.get('isConnecting')) - this.getTaskInfo(); - }, - - getTaskInfo: function() { - var request = App.ajax.send({ - name: 'custom_action.request', - sender: this, - data: { - requestId: this.get('currentRequestId'), - taskId: this.get('currentTaskId') - }, - success: 'getTaskInfoSuccess' - }); - this.set('request', request); - }, - - getTaskInfoSuccess: function(data) { - var task = data.Tasks; - this.set('responseFromServer', { - stderr: task.stderr, - stdout: task.stdout - }); - if (task.status === 'COMPLETED') { - var structuredOut = task.structured_out.db_connection_check; - if (structuredOut.exit_code != 0) { - this.set('responseFromServer', { - stderr: task.stderr, - stdout: task.stdout, - structuredOut: structuredOut.message - }); - this.setResponseStatus('failed'); - } else { - App.db.set('tmp', this.get('parentView.service.serviceName') + '_connection', this.get('preparedDBProperties')); - this.setResponseStatus('success'); - } - } - if (task.status === 'FAILED') { - this.setResponseStatus('failed'); - } - if (/PENDING|QUEUED|IN_PROGRESS/.test(task.status)) { - Em.run.later(this, function() { - this.startPolling(); - }, this.get('pollInterval')); - } - }, - - onCreateActionError: function(jqXhr, status, errorMessage) { - this.setResponseStatus('failed'); - this.set('responseFromServer', errorMessage); - }, - - setResponseStatus: function(isSuccess) { - var isSuccess = isSuccess == 'success'; - this.setConnectingStatus(false); - this.set('responseCaption', isSuccess ? Em.I18n.t('services.service.config.database.connection.success') : Em.I18n.t('services.service.config.database.connection.failed')); - this.set('isConnectionSuccess', isSuccess); - this.set('isRequestResolved', true); - }, - /** - * Switch captions and statuses for active/non-active request. - * - * @method setConnectionStatus - * @param {Boolean} [active] - */ - setConnectingStatus: function(active) { - if (active) { - this.set('responseCaption', Em.I18n.t('services.service.config.database.connection.inProgress')); - } - this.set('controller.testConnectionInProgress', !!active); - this.set('btnCaption', !!active ? Em.I18n.t('services.service.config.database.btn.connecting') : Em.I18n.t('services.service.config.database.btn.idle')); - this.set('isConnecting', !!active); - }, - /** - * Set view to init status. - * - * @method restore - **/ - restore: function() { - if (this.get('request')) { - this.get('request').abort(); - this.set('request', null); - } - this.set('responseCaption', null); - this.set('responseFromServer', null); - this.setConnectingStatus(false); - this.set('isRequestResolved', false); - }, - /** - * `Action` method for showing response from server in popup. - * - * @method showLogsPopup - **/ - showLogsPopup: function() { - if (this.get('isConnectionSuccess')) return; - var _this = this; - var popup = App.showAlertPopup('Error: {0} connection'.format(this.get('databaseName'))); - if (typeof this.get('responseFromServer') == 'object') { - popup.set('bodyClass', Em.View.extend({ - templateName: require('templates/common/error_log_body'), - openedTask: _this.get('responseFromServer') - })); - } else { - popup.set('body', this.get('responseFromServer')); - } - return popup; - } -}); - http://git-wip-us.apache.org/repos/asf/ambari/blob/11efa2f5/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js b/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js index 7aeae36..1ee587e 100644 --- a/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js +++ b/ambari-web/test/controllers/main/admin/stack_and_upgrade_controller_test.js @@ -531,4 +531,54 @@ describe('App.MainAdminStackAndUpgradeController', function() { expect(item.get('status')).to.equal('PENDING'); }); }); + + describe("#prepareRepoForSaving()", function () { + it("prepare date for saving", function () { + var repo = Em.Object.create({ + operatingSystems: [ + Em.Object.create({ + osType: "redhat6", + isDisabled: Ember.computed.not('isSelected'), + repositories: [Em.Object.create({ + "baseUrl": "111121", + "repoId": "HDP-2.2", + "repoName": "HDP", + hasError: false + }), + Em.Object.create({ + "baseUrl": "1", + "repoId": "HDP-UTILS-1.1.0.20", + "repoName": "HDP-UTILS", + hasError: false + })] + }) + ] + }); + var result = { + "operating_systems": [ + { + "OperatingSystems": { + "os_type": "redhat6" + }, + "repositories": [ + { + "Repositories": { + "base_url": "111121", + "repo_id": "HDP-2.2", + "repo_name": "HDP" + } + }, + { + "Repositories": { + "base_url": "1", + "repo_id": "HDP-UTILS-1.1.0.20", + "repo_name": "HDP-UTILS" + } + } + ] + } + ]} + expect(controller.prepareRepoForSaving(repo)).to.eql(result); + }); + }); }); http://git-wip-us.apache.org/repos/asf/ambari/blob/11efa2f5/ambari-web/test/views/common/controls_view_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/views/common/controls_view_test.js b/ambari-web/test/views/common/controls_view_test.js new file mode 100644 index 0000000..7828f83 --- /dev/null +++ b/ambari-web/test/views/common/controls_view_test.js @@ -0,0 +1,606 @@ +/** + * 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('views/common/controls_view'); + +describe('App.ServiceConfigRadioButtons', function () { + + describe('#didInsertElement', function () { + + var view = App.ServiceConfigRadioButtons.create({ + categoryConfigsAll: [], + controller: Em.Object.create({ + wizardController: Em.Object.create({}) + }), + serviceConfig: Em.Object.create({ + value: null + }) + }), + cases = [ + { + wizardControllerName: 'addServiceController', + serviceConfigValue: 'New MySQL Database', + onOptionsChangeCalledTwice: true, + handleDBConnectionPropertyCalledTwice: false, + title: 'Add Service Wizard, New MySQL Database' + }, + { + wizardControllerName: 'addServiceController', + serviceConfigValue: 'Existing MySQL Database', + onOptionsChangeCalledTwice: false, + handleDBConnectionPropertyCalledTwice: true, + title: 'Add Service Wizard, Existing MySQL Database' + }, + { + wizardControllerName: 'installerController', + serviceConfigValue: 'New MySQL Database', + onOptionsChangeCalledTwice: true, + handleDBConnectionPropertyCalledTwice: false, + title: 'Install Wizard, New MySQL Database' + }, + { + wizardControllerName: 'installerController', + serviceConfigValue: 'Existing MySQL Database', + onOptionsChangeCalledTwice: false, + handleDBConnectionPropertyCalledTwice: true, + title: 'Install Wizard, Existing MySQL Database' + }, + { + wizardControllerName: null, + serviceConfigValue: null, + onOptionsChangeCalledTwice: false, + handleDBConnectionPropertyCalledTwice: false, + title: 'Service Configs Page' + } + ]; + + beforeEach(function () { + sinon.stub(view, 'onOptionsChange', Em.K); + sinon.stub(view, 'handleDBConnectionProperty', Em.K); + }); + + afterEach(function () { + view.onOptionsChange.restore(); + view.handleDBConnectionProperty.restore(); + }); + + cases.forEach(function (item) { + it(item.title, function () { + view.set('controller.wizardController.name', item.wizardControllerName); + view.set('serviceConfig.value', item.serviceConfigValue); + view.didInsertElement(); + expect(view.onOptionsChange.calledTwice).to.equal(item.onOptionsChangeCalledTwice); + expect(view.handleDBConnectionProperty.calledTwice).to.equal(item.handleDBConnectionPropertyCalledTwice); + }); + }); + + }); + + describe('#databaseNameProperty', function () { + + var view = App.ServiceConfigRadioButtons.create({ + serviceConfig: Em.Object.create(), + categoryConfigsAll: [ + { + name: 'ambari.hive.db.schema.name', + value: 'db0' + }, + { + name: 'oozie.db.schema.name', + value: 'db2' + } + ] + }), + cases = [ + { + serviceName: 'HIVE', + value: 'db0' + }, + { + serviceName: 'OOZIE', + value: 'db2' + } + ]; + + cases.forEach(function (item) { + it(item.serviceName, function () { + view.set('serviceConfig.serviceName', item.serviceName); + expect(view.get('databaseNameProperty.value')).to.equal(item.value); + expect(view.get('databaseName')).to.equal(item.value); + }); + }); + + it('default case', function () { + view.set('serviceConfig.serviceName', 'YARN'); + expect(view.get('databaseNameProperty')).to.be.null; + expect(view.get('databaseName')).to.be.null; + }); + + }); + + describe('#hostNameProperty', function () { + + var view = App.ServiceConfigRadioButtons.create({ + serviceConfig: Em.Object.create(), + categoryConfigsAll: [ + { + name: 'hive_ambari_host', + value: 'h0' + }, + { + name: 'hive_existing_mysql_host', + value: 'h1' + }, + { + name: 'hive_existing_postgresql_host', + value: 'h2' + }, + { + name: 'hive_existing_oracle_host', + value: 'h3' + }, + { + name: 'hive_existing_mssql_server_host', + value: 'h4' + }, + { + name: 'hive_existing_mssql_server_2_host', + value: 'h5' + }, + { + name: 'hive_hostname', + value: 'h6' + }, + { + name: 'oozie_ambari_host', + value: 'h10' + }, + { + name: 'oozie_existing_mysql_host', + value: 'h11' + }, + { + name: 'oozie_existing_postgresql_host', + value: 'h12' + }, + { + name: 'oozie_existing_oracle_host', + value: 'h13' + }, + { + name: 'oozie_existing_mssql_server_host', + value: 'h14' + }, + { + name: 'oozie_existing_mssql_server_2_host', + value: 'h15' + }, + { + name: 'oozie_hostname', + value: 'h16' + } + ] + }), + cases = [ + { + serviceName: 'HIVE', + value: 'New MySQL Database', + expected: 'h0' + }, + { + serviceName: 'HIVE', + value: 'Existing MySQL Database', + expected: 'h1' + }, + { + serviceName: 'HIVE', + value: Em.I18n.t('services.service.config.hive.oozie.postgresql'), + expected: 'h2' + }, + { + serviceName: 'HIVE', + value: 'Existing Oracle Database', + expected: 'h3' + }, + { + serviceName: 'HIVE', + value: 'Existing MSSQL Server database with SQL authentication', + expected: 'h4' + }, + { + serviceName: 'HIVE', + value: 'Existing MSSQL Server database with integrated authentication', + expected: 'h5' + }, + { + serviceName: 'HIVE', + value: 'default case', + expected: 'h6' + }, + { + serviceName: 'OOZIE', + value: 'New Derby Database', + expected: 'h10' + }, + { + serviceName: 'OOZIE', + value: 'Existing MySQL Database', + expected: 'h11' + }, + { + serviceName: 'OOZIE', + value: Em.I18n.t('services.service.config.hive.oozie.postgresql'), + expected: 'h12' + }, + { + serviceName: 'OOZIE', + value: 'Existing Oracle Database', + expected: 'h13' + }, + { + serviceName: 'OOZIE', + value: 'Existing MSSQL Server database with SQL authentication', + expected: 'h14' + }, + { + serviceName: 'OOZIE', + value: 'Existing MSSQL Server database with integrated authentication', + expected: 'h15' + }, + { + serviceName: 'OOZIE', + value: 'default case', + expected: 'h16' + } + ]; + + before(function () { + sinon.stub(view, 'handleDBConnectionProperty', Em.K); + }); + + after(function () { + view.handleDBConnectionProperty.restore(); + }); + + cases.forEach(function (item) { + it(item.serviceName + ', ' + item.value, function () { + view.get('serviceConfig').setProperties({ + serviceName: item.serviceName, + value: item.value + }); + expect(view.get('hostNameProperty.value')).to.equal(item.expected); + expect(view.get('hostName')).to.equal(item.expected); + }); + }); + + }); + + describe('#onOptionsChange', function () { + + var view = App.ServiceConfigRadioButtons.create({ + hostName: null, + databaseName: null, + connectionUrl: Em.Object.create(), + dbClass: Em.Object.create(), + serviceConfig: Em.Object.create(), + categoryConfigsAll: [ + Em.Object.create({ + name: 'javax.jdo.option.ConnectionUserName' + }), + Em.Object.create({ + name: 'javax.jdo.option.ConnectionPassword' + }), + Em.Object.create({ + name: 'oozie.service.JPAService.jdbc.username' + }), + Em.Object.create({ + name: 'oozie.service.JPAService.jdbc.password' + }) + ], + parentView: Em.Object.create({ + serviceConfigs: [ + { + name: 'hive_database_type', + value: null + } + ] + }), + configs: [{}] + }), + cases = [ + { + serviceName: 'HIVE', + serviceConfigValue: 'New MySQL Database', + databaseName: 'db0', + hostName: 'h0', + connectionUrlValue: 'jdbc:mysql://h0/db0?createDatabaseIfNotExist=true', + dbClassValue: 'com.mysql.jdbc.Driver', + isAuthVisibleAndRequired: true, + hiveDbTypeValue: 'mysql' + }, + { + serviceName: 'HIVE', + serviceConfigValue: Em.I18n.t('services.service.config.hive.oozie.postgresql'), + databaseName: 'db1', + hostName: 'h1', + connectionUrlValue: 'jdbc:postgresql://h1:5432/db1', + dbClassValue: 'org.postgresql.Driver', + isAuthVisibleAndRequired: true, + hiveDbTypeValue: 'postgres' + }, + { + serviceName: 'HIVE', + serviceConfigValue: 'Existing MySQL Database', + databaseName: 'db2', + hostName: 'h2', + connectionUrlValue: 'jdbc:mysql://h2/db2?createDatabaseIfNotExist=true', + dbClassValue: 'com.mysql.jdbc.Driver', + isAuthVisibleAndRequired: true, + hiveDbTypeValue: 'mysql' + }, + { + serviceName: 'HIVE', + serviceConfigValue: 'Existing MSSQL Server database with SQL authentication', + databaseName: 'db3', + hostName: 'h3', + connectionUrlValue: 'jdbc:sqlserver://h3;databaseName=db3', + dbClassValue: 'com.microsoft.sqlserver.jdbc.SQLServerDriver', + isAuthVisibleAndRequired: true, + hiveDbTypeValue: 'mssql' + }, + { + serviceName: 'HIVE', + serviceConfigValue: 'Existing Oracle Database', + databaseName: 'db4', + hostName: 'h4', + connectionUrlValue: 'jdbc:oracle:thin:@//h4:1521/db4', + dbClassValue: 'oracle.jdbc.driver.OracleDriver', + isAuthVisibleAndRequired: true, + hiveDbTypeValue: 'oracle' + }, + { + serviceName: 'HIVE', + serviceConfigValue: 'Existing MSSQL Server database with integrated authentication', + databaseName: 'db5', + hostName: 'h5', + connectionUrlValue: 'jdbc:sqlserver://h5;databaseName=db5;integratedSecurity=true', + dbClassValue: 'com.microsoft.sqlserver.jdbc.SQLServerDriver', + isAuthVisibleAndRequired: false, + hiveDbTypeValue: 'mssql' + }, + { + serviceName: 'OOZIE', + serviceConfigValue: 'New Derby Database', + databaseName: 'db6', + hostName: 'h6', + connectionUrlValue: 'jdbc:derby:${oozie.data.dir}/${oozie.db.schema.name}-db;create=true', + dbClassValue: 'org.apache.derby.jdbc.EmbeddedDriver', + isAuthVisibleAndRequired: true + }, + { + serviceName: 'OOZIE', + serviceConfigValue: 'Existing MySQL Database', + databaseName: 'db7', + hostName: 'h7', + connectionUrlValue: 'jdbc:mysql://h7/db7', + dbClassValue: 'com.mysql.jdbc.Driver', + isAuthVisibleAndRequired: true + }, + { + serviceName: 'OOZIE', + serviceConfigValue: Em.I18n.t('services.service.config.hive.oozie.postgresql'), + databaseName: 'db8', + hostName: 'h8', + connectionUrlValue: 'jdbc:postgresql://h8:5432/db8', + dbClassValue: 'org.postgresql.Driver', + isAuthVisibleAndRequired: true + }, + { + serviceName: 'OOZIE', + serviceConfigValue: 'Existing MSSQL Server database with SQL authentication', + databaseName: 'db9', + hostName: 'h9', + connectionUrlValue: 'jdbc:sqlserver://h9;databaseName=db9', + dbClassValue: 'com.microsoft.sqlserver.jdbc.SQLServerDriver', + isAuthVisibleAndRequired: true + }, + { + serviceName: 'OOZIE', + serviceConfigValue: 'Existing Oracle Database', + databaseName: 'db10', + hostName: 'h10', + connectionUrlValue: 'jdbc:oracle:thin:@//h10:1521/db10', + dbClassValue: 'oracle.jdbc.driver.OracleDriver', + isAuthVisibleAndRequired: true + }, + { + serviceName: 'OOZIE', + serviceConfigValue: 'Existing MSSQL Server database with integrated authentication', + databaseName: 'db11', + hostName: 'h11', + connectionUrlValue: 'jdbc:sqlserver://h11;databaseName=db11;integratedSecurity=true', + dbClassValue: 'com.microsoft.sqlserver.jdbc.SQLServerDriver', + isAuthVisibleAndRequired: false + } + ], + serviceAuthPropsMap = { + HIVE: ['javax.jdo.option.ConnectionUserName', 'javax.jdo.option.ConnectionPassword'], + OOZIE: ['oozie.service.JPAService.jdbc.username', 'oozie.service.JPAService.jdbc.password'] + }; + + before(function () { + sinon.stub(view, 'handleDBConnectionProperty', Em.K); + }); + + after(function () { + view.handleDBConnectionProperty.restore(); + }); + + cases.forEach(function (item) { + it(item.serviceName + ', ' + item.serviceConfigValue, function () { + view.get('serviceConfig').setProperties({ + serviceName: item.serviceName, + value: item.serviceConfigValue + }); + view.setProperties({ + databaseName: item.databaseName, + hostName: item.hostName + }); + expect(view.get('connectionUrl.value')).to.equal(item.connectionUrlValue); + expect(view.get('dbClass.value')).to.equal(item.dbClassValue); + serviceAuthPropsMap[item.serviceName].forEach(function (propName) { + expect(view.get('categoryConfigsAll').findProperty('name', propName).get('isVisible')).to.equal(item.isAuthVisibleAndRequired); + expect(view.get('categoryConfigsAll').findProperty('name', propName).get('isRequired')).to.equal(item.isAuthVisibleAndRequired); + }); + if (item.serviceName == 'HIVE') { + expect(view.get('parentView.serviceConfigs').findProperty('name', 'hive_database_type').value).to.equal(item.hiveDbTypeValue); + } + }); + }); + + }); + +}); + +describe('App.ServiceConfigRadioButton', function () { + + describe('#disabled', function () { + + var cases = [ + { + wizardControllerName: 'addServiceController', + value: 'New MySQL Database', + title: 'Add Service Wizard, new database', + disabled: false + }, + { + wizardControllerName: 'installerController', + value: 'New MySQL Database', + title: 'Install Wizard, new database', + disabled: false + }, + { + wizardControllerName: 'addServiceController', + value: 'Existing MySQL Database', + title: 'Add Service Wizard, existing database', + disabled: false + }, + { + wizardControllerName: 'installerController', + value: 'Existing MySQL Database', + title: 'Install Wizard, existing database', + disabled: false + }, + { + wizardControllerName: null, + value: 'New MySQL Database', + title: 'No installer, new database', + disabled: true + }, + { + wizardControllerName: null, + value: 'Existing MySQL Database', + title: 'No installer, existing database', + disabled: false + } + ]; + + cases.forEach(function (item) { + it(item.title, function () { + var view = App.ServiceConfigRadioButton.create({ + parentView: Em.Object.create({ + serviceConfig: Em.Object.create() + }), + controller: Em.Object.create({ + wizardController: Em.Object.create({ + name: null + }) + }) + }); + view.set('value', item.value); + view.set('controller.wizardController.name', item.wizardControllerName); + view.set('parentView.serviceConfig.isEditable', true); + expect(view.get('disabled')).to.equal(item.disabled); + }); + }); + + it('parent view is disabled', function () { + var view = App.ServiceConfigRadioButton.create({ + parentView: Em.Object.create({ + serviceConfig: Em.Object.create() + }) + }); + view.set('parentView.serviceConfig.isEditable', false); + expect(view.get('disabled')).to.be.true; + }); + + }); + +}); + +describe('App.CheckDBConnectionView', function () { + + describe('#masterHostName', function () { + + var cases = [ + { + serviceName: 'OOZIE', + value: 'h0' + }, + { + serviceName: 'KERBEROS', + value: 'h1' + }, + { + serviceName: 'HIVE', + value: 'h2' + } + ], + categoryConfigsAll = [ + Em.Object.create({ + name: 'oozieserver_host', + value: 'h0' + }), + Em.Object.create({ + name: 'kdc_host', + value: 'h1' + }), + Em.Object.create({ + name: 'hive_ambari_host', + value: 'h2' + }) + ]; + + cases.forEach(function (item) { + it(item.serviceName, function () { + var view = App.CheckDBConnectionView.create({ + parentView: { + service: { + serviceName: item.serviceName + }, + categoryConfigsAll: categoryConfigsAll + } + }); + expect(view.get('masterHostName')).to.equal(item.value); + }); + }); + + }); + +}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/11efa2f5/ambari-web/test/views/wizard/controls_view_test.js ---------------------------------------------------------------------- diff --git a/ambari-web/test/views/wizard/controls_view_test.js b/ambari-web/test/views/wizard/controls_view_test.js deleted file mode 100644 index a48c3c7..0000000 --- a/ambari-web/test/views/wizard/controls_view_test.js +++ /dev/null @@ -1,606 +0,0 @@ -/** - * 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('views/wizard/controls_view'); - -describe('App.ServiceConfigRadioButtons', function () { - - describe('#didInsertElement', function () { - - var view = App.ServiceConfigRadioButtons.create({ - categoryConfigsAll: [], - controller: Em.Object.create({ - wizardController: Em.Object.create({}) - }), - serviceConfig: Em.Object.create({ - value: null - }) - }), - cases = [ - { - wizardControllerName: 'addServiceController', - serviceConfigValue: 'New MySQL Database', - onOptionsChangeCalledTwice: true, - handleDBConnectionPropertyCalledTwice: false, - title: 'Add Service Wizard, New MySQL Database' - }, - { - wizardControllerName: 'addServiceController', - serviceConfigValue: 'Existing MySQL Database', - onOptionsChangeCalledTwice: false, - handleDBConnectionPropertyCalledTwice: true, - title: 'Add Service Wizard, Existing MySQL Database' - }, - { - wizardControllerName: 'installerController', - serviceConfigValue: 'New MySQL Database', - onOptionsChangeCalledTwice: true, - handleDBConnectionPropertyCalledTwice: false, - title: 'Install Wizard, New MySQL Database' - }, - { - wizardControllerName: 'installerController', - serviceConfigValue: 'Existing MySQL Database', - onOptionsChangeCalledTwice: false, - handleDBConnectionPropertyCalledTwice: true, - title: 'Install Wizard, Existing MySQL Database' - }, - { - wizardControllerName: null, - serviceConfigValue: null, - onOptionsChangeCalledTwice: false, - handleDBConnectionPropertyCalledTwice: false, - title: 'Service Configs Page' - } - ]; - - beforeEach(function () { - sinon.stub(view, 'onOptionsChange', Em.K); - sinon.stub(view, 'handleDBConnectionProperty', Em.K); - }); - - afterEach(function () { - view.onOptionsChange.restore(); - view.handleDBConnectionProperty.restore(); - }); - - cases.forEach(function (item) { - it(item.title, function () { - view.set('controller.wizardController.name', item.wizardControllerName); - view.set('serviceConfig.value', item.serviceConfigValue); - view.didInsertElement(); - expect(view.onOptionsChange.calledTwice).to.equal(item.onOptionsChangeCalledTwice); - expect(view.handleDBConnectionProperty.calledTwice).to.equal(item.handleDBConnectionPropertyCalledTwice); - }); - }); - - }); - - describe('#databaseNameProperty', function () { - - var view = App.ServiceConfigRadioButtons.create({ - serviceConfig: Em.Object.create(), - categoryConfigsAll: [ - { - name: 'ambari.hive.db.schema.name', - value: 'db0' - }, - { - name: 'oozie.db.schema.name', - value: 'db2' - } - ] - }), - cases = [ - { - serviceName: 'HIVE', - value: 'db0' - }, - { - serviceName: 'OOZIE', - value: 'db2' - } - ]; - - cases.forEach(function (item) { - it(item.serviceName, function () { - view.set('serviceConfig.serviceName', item.serviceName); - expect(view.get('databaseNameProperty.value')).to.equal(item.value); - expect(view.get('databaseName')).to.equal(item.value); - }); - }); - - it('default case', function () { - view.set('serviceConfig.serviceName', 'YARN'); - expect(view.get('databaseNameProperty')).to.be.null; - expect(view.get('databaseName')).to.be.null; - }); - - }); - - describe('#hostNameProperty', function () { - - var view = App.ServiceConfigRadioButtons.create({ - serviceConfig: Em.Object.create(), - categoryConfigsAll: [ - { - name: 'hive_ambari_host', - value: 'h0' - }, - { - name: 'hive_existing_mysql_host', - value: 'h1' - }, - { - name: 'hive_existing_postgresql_host', - value: 'h2' - }, - { - name: 'hive_existing_oracle_host', - value: 'h3' - }, - { - name: 'hive_existing_mssql_server_host', - value: 'h4' - }, - { - name: 'hive_existing_mssql_server_2_host', - value: 'h5' - }, - { - name: 'hive_hostname', - value: 'h6' - }, - { - name: 'oozie_ambari_host', - value: 'h10' - }, - { - name: 'oozie_existing_mysql_host', - value: 'h11' - }, - { - name: 'oozie_existing_postgresql_host', - value: 'h12' - }, - { - name: 'oozie_existing_oracle_host', - value: 'h13' - }, - { - name: 'oozie_existing_mssql_server_host', - value: 'h14' - }, - { - name: 'oozie_existing_mssql_server_2_host', - value: 'h15' - }, - { - name: 'oozie_hostname', - value: 'h16' - } - ] - }), - cases = [ - { - serviceName: 'HIVE', - value: 'New MySQL Database', - expected: 'h0' - }, - { - serviceName: 'HIVE', - value: 'Existing MySQL Database', - expected: 'h1' - }, - { - serviceName: 'HIVE', - value: Em.I18n.t('services.service.config.hive.oozie.postgresql'), - expected: 'h2' - }, - { - serviceName: 'HIVE', - value: 'Existing Oracle Database', - expected: 'h3' - }, - { - serviceName: 'HIVE', - value: 'Existing MSSQL Server database with SQL authentication', - expected: 'h4' - }, - { - serviceName: 'HIVE', - value: 'Existing MSSQL Server database with integrated authentication', - expected: 'h5' - }, - { - serviceName: 'HIVE', - value: 'default case', - expected: 'h6' - }, - { - serviceName: 'OOZIE', - value: 'New Derby Database', - expected: 'h10' - }, - { - serviceName: 'OOZIE', - value: 'Existing MySQL Database', - expected: 'h11' - }, - { - serviceName: 'OOZIE', - value: Em.I18n.t('services.service.config.hive.oozie.postgresql'), - expected: 'h12' - }, - { - serviceName: 'OOZIE', - value: 'Existing Oracle Database', - expected: 'h13' - }, - { - serviceName: 'OOZIE', - value: 'Existing MSSQL Server database with SQL authentication', - expected: 'h14' - }, - { - serviceName: 'OOZIE', - value: 'Existing MSSQL Server database with integrated authentication', - expected: 'h15' - }, - { - serviceName: 'OOZIE', - value: 'default case', - expected: 'h16' - } - ]; - - before(function () { - sinon.stub(view, 'handleDBConnectionProperty', Em.K); - }); - - after(function () { - view.handleDBConnectionProperty.restore(); - }); - - cases.forEach(function (item) { - it(item.serviceName + ', ' + item.value, function () { - view.get('serviceConfig').setProperties({ - serviceName: item.serviceName, - value: item.value - }); - expect(view.get('hostNameProperty.value')).to.equal(item.expected); - expect(view.get('hostName')).to.equal(item.expected); - }); - }); - - }); - - describe('#onOptionsChange', function () { - - var view = App.ServiceConfigRadioButtons.create({ - hostName: null, - databaseName: null, - connectionUrl: Em.Object.create(), - dbClass: Em.Object.create(), - serviceConfig: Em.Object.create(), - categoryConfigsAll: [ - Em.Object.create({ - name: 'javax.jdo.option.ConnectionUserName' - }), - Em.Object.create({ - name: 'javax.jdo.option.ConnectionPassword' - }), - Em.Object.create({ - name: 'oozie.service.JPAService.jdbc.username' - }), - Em.Object.create({ - name: 'oozie.service.JPAService.jdbc.password' - }) - ], - parentView: Em.Object.create({ - serviceConfigs: [ - { - name: 'hive_database_type', - value: null - } - ] - }), - configs: [{}] - }), - cases = [ - { - serviceName: 'HIVE', - serviceConfigValue: 'New MySQL Database', - databaseName: 'db0', - hostName: 'h0', - connectionUrlValue: 'jdbc:mysql://h0/db0?createDatabaseIfNotExist=true', - dbClassValue: 'com.mysql.jdbc.Driver', - isAuthVisibleAndRequired: true, - hiveDbTypeValue: 'mysql' - }, - { - serviceName: 'HIVE', - serviceConfigValue: Em.I18n.t('services.service.config.hive.oozie.postgresql'), - databaseName: 'db1', - hostName: 'h1', - connectionUrlValue: 'jdbc:postgresql://h1:5432/db1', - dbClassValue: 'org.postgresql.Driver', - isAuthVisibleAndRequired: true, - hiveDbTypeValue: 'postgres' - }, - { - serviceName: 'HIVE', - serviceConfigValue: 'Existing MySQL Database', - databaseName: 'db2', - hostName: 'h2', - connectionUrlValue: 'jdbc:mysql://h2/db2?createDatabaseIfNotExist=true', - dbClassValue: 'com.mysql.jdbc.Driver', - isAuthVisibleAndRequired: true, - hiveDbTypeValue: 'mysql' - }, - { - serviceName: 'HIVE', - serviceConfigValue: 'Existing MSSQL Server database with SQL authentication', - databaseName: 'db3', - hostName: 'h3', - connectionUrlValue: 'jdbc:sqlserver://h3;databaseName=db3', - dbClassValue: 'com.microsoft.sqlserver.jdbc.SQLServerDriver', - isAuthVisibleAndRequired: true, - hiveDbTypeValue: 'mssql' - }, - { - serviceName: 'HIVE', - serviceConfigValue: 'Existing Oracle Database', - databaseName: 'db4', - hostName: 'h4', - connectionUrlValue: 'jdbc:oracle:thin:@//h4:1521/db4', - dbClassValue: 'oracle.jdbc.driver.OracleDriver', - isAuthVisibleAndRequired: true, - hiveDbTypeValue: 'oracle' - }, - { - serviceName: 'HIVE', - serviceConfigValue: 'Existing MSSQL Server database with integrated authentication', - databaseName: 'db5', - hostName: 'h5', - connectionUrlValue: 'jdbc:sqlserver://h5;databaseName=db5;integratedSecurity=true', - dbClassValue: 'com.microsoft.sqlserver.jdbc.SQLServerDriver', - isAuthVisibleAndRequired: false, - hiveDbTypeValue: 'mssql' - }, - { - serviceName: 'OOZIE', - serviceConfigValue: 'New Derby Database', - databaseName: 'db6', - hostName: 'h6', - connectionUrlValue: 'jdbc:derby:${oozie.data.dir}/${oozie.db.schema.name}-db;create=true', - dbClassValue: 'org.apache.derby.jdbc.EmbeddedDriver', - isAuthVisibleAndRequired: true - }, - { - serviceName: 'OOZIE', - serviceConfigValue: 'Existing MySQL Database', - databaseName: 'db7', - hostName: 'h7', - connectionUrlValue: 'jdbc:mysql://h7/db7', - dbClassValue: 'com.mysql.jdbc.Driver', - isAuthVisibleAndRequired: true - }, - { - serviceName: 'OOZIE', - serviceConfigValue: Em.I18n.t('services.service.config.hive.oozie.postgresql'), - databaseName: 'db8', - hostName: 'h8', - connectionUrlValue: 'jdbc:postgresql://h8:5432/db8', - dbClassValue: 'org.postgresql.Driver', - isAuthVisibleAndRequired: true - }, - { - serviceName: 'OOZIE', - serviceConfigValue: 'Existing MSSQL Server database with SQL authentication', - databaseName: 'db9', - hostName: 'h9', - connectionUrlValue: 'jdbc:sqlserver://h9;databaseName=db9', - dbClassValue: 'com.microsoft.sqlserver.jdbc.SQLServerDriver', - isAuthVisibleAndRequired: true - }, - { - serviceName: 'OOZIE', - serviceConfigValue: 'Existing Oracle Database', - databaseName: 'db10', - hostName: 'h10', - connectionUrlValue: 'jdbc:oracle:thin:@//h10:1521/db10', - dbClassValue: 'oracle.jdbc.driver.OracleDriver', - isAuthVisibleAndRequired: true - }, - { - serviceName: 'OOZIE', - serviceConfigValue: 'Existing MSSQL Server database with integrated authentication', - databaseName: 'db11', - hostName: 'h11', - connectionUrlValue: 'jdbc:sqlserver://h11;databaseName=db11;integratedSecurity=true', - dbClassValue: 'com.microsoft.sqlserver.jdbc.SQLServerDriver', - isAuthVisibleAndRequired: false - } - ], - serviceAuthPropsMap = { - HIVE: ['javax.jdo.option.ConnectionUserName', 'javax.jdo.option.ConnectionPassword'], - OOZIE: ['oozie.service.JPAService.jdbc.username', 'oozie.service.JPAService.jdbc.password'] - }; - - before(function () { - sinon.stub(view, 'handleDBConnectionProperty', Em.K); - }); - - after(function () { - view.handleDBConnectionProperty.restore(); - }); - - cases.forEach(function (item) { - it(item.serviceName + ', ' + item.serviceConfigValue, function () { - view.get('serviceConfig').setProperties({ - serviceName: item.serviceName, - value: item.serviceConfigValue - }); - view.setProperties({ - databaseName: item.databaseName, - hostName: item.hostName - }); - expect(view.get('connectionUrl.value')).to.equal(item.connectionUrlValue); - expect(view.get('dbClass.value')).to.equal(item.dbClassValue); - serviceAuthPropsMap[item.serviceName].forEach(function (propName) { - expect(view.get('categoryConfigsAll').findProperty('name', propName).get('isVisible')).to.equal(item.isAuthVisibleAndRequired); - expect(view.get('categoryConfigsAll').findProperty('name', propName).get('isRequired')).to.equal(item.isAuthVisibleAndRequired); - }); - if (item.serviceName == 'HIVE') { - expect(view.get('parentView.serviceConfigs').findProperty('name', 'hive_database_type').value).to.equal(item.hiveDbTypeValue); - } - }); - }); - - }); - -}); - -describe('App.ServiceConfigRadioButton', function () { - - describe('#disabled', function () { - - var cases = [ - { - wizardControllerName: 'addServiceController', - value: 'New MySQL Database', - title: 'Add Service Wizard, new database', - disabled: false - }, - { - wizardControllerName: 'installerController', - value: 'New MySQL Database', - title: 'Install Wizard, new database', - disabled: false - }, - { - wizardControllerName: 'addServiceController', - value: 'Existing MySQL Database', - title: 'Add Service Wizard, existing database', - disabled: false - }, - { - wizardControllerName: 'installerController', - value: 'Existing MySQL Database', - title: 'Install Wizard, existing database', - disabled: false - }, - { - wizardControllerName: null, - value: 'New MySQL Database', - title: 'No installer, new database', - disabled: true - }, - { - wizardControllerName: null, - value: 'Existing MySQL Database', - title: 'No installer, existing database', - disabled: false - } - ]; - - cases.forEach(function (item) { - it(item.title, function () { - var view = App.ServiceConfigRadioButton.create({ - parentView: Em.Object.create({ - serviceConfig: Em.Object.create() - }), - controller: Em.Object.create({ - wizardController: Em.Object.create({ - name: null - }) - }) - }); - view.set('value', item.value); - view.set('controller.wizardController.name', item.wizardControllerName); - view.set('parentView.serviceConfig.isEditable', true); - expect(view.get('disabled')).to.equal(item.disabled); - }); - }); - - it('parent view is disabled', function () { - var view = App.ServiceConfigRadioButton.create({ - parentView: Em.Object.create({ - serviceConfig: Em.Object.create() - }) - }); - view.set('parentView.serviceConfig.isEditable', false); - expect(view.get('disabled')).to.be.true; - }); - - }); - -}); - -describe('App.CheckDBConnectionView', function () { - - describe('#masterHostName', function () { - - var cases = [ - { - serviceName: 'OOZIE', - value: 'h0' - }, - { - serviceName: 'KERBEROS', - value: 'h1' - }, - { - serviceName: 'HIVE', - value: 'h2' - } - ], - categoryConfigsAll = [ - Em.Object.create({ - name: 'oozieserver_host', - value: 'h0' - }), - Em.Object.create({ - name: 'kdc_host', - value: 'h1' - }), - Em.Object.create({ - name: 'hive_ambari_host', - value: 'h2' - }) - ]; - - cases.forEach(function (item) { - it(item.serviceName, function () { - var view = App.CheckDBConnectionView.create({ - parentView: { - service: { - serviceName: item.serviceName - }, - categoryConfigsAll: categoryConfigsAll - } - }); - expect(view.get('masterHostName')).to.equal(item.value); - }); - }); - - }); - -}); \ No newline at end of file