import React from 'react'; import PropTypes from 'prop-types'; import { Icon, Button, MessageDialog, Table, FormControl, inlineEditFormatterFactory, } from 'patternfly-react'; import * as resolve from 'table-resolver'; import $ from 'jquery'; import ForemanModal from 'foremanReact/components/ForemanModal'; import { sprintf, translate as __ } from 'foremanReact/common/I18n'; import Select from 'foremanReact/components/common/forms/Select'; import ParameterSelection from '../ParameterSelection'; import ExistingHostSelection from '../ExistingHostSelection'; import AddTableEntry from '../common/AddTableEntry'; import DeleteTableEntry from '../common/DeleteTableEntry'; import RailsData from '../common/RailsData'; import AppDefinitionSelector from './components/AppDefinitionSelector'; import ServiceCounter from './components/ServiceCounter'; import { arrayToObject, EasyHeaderFormatter } from '../../helper'; import { PARAMETER_SELECTION_PARAM_TYPE_FOREMAN, PARAMETER_SELECTION_PARAM_TYPE_ANSIBLE, } from '../ParameterSelection/ParameterSelectionConstants'; class ApplicationInstance extends React.Component { static isEditing({ rowData }) { return rowData.backup !== undefined; } changeDataAllowed() { return this.props.editMode || this.props.appDefinition.id === ''; } validateParameters() { let result = true; let msg = ''; this.props.hosts.forEach(h => { if ( h.foremanParameters.map(e => e.value).filter(i => i === '').length > 0 ) { result = false; if (msg === '') { msg += __( 'For some hosts the values for some parameters are missing. Check the values for these hosts:\n' ); } msg += `- ${h.hostname}\n`; } }); const invalidMinServices = this.props.services.filter( s => Number(s.minCount) !== 0 && s.currentCount < s.minCount ); const invalidMaxServices = this.props.services.filter( s => Number(s.maxCount) !== 0 && s.currentCount > s.maxCount ); if (invalidMinServices.length > 0 || invalidMaxServices.length > 0) { result = false; if (msg !== '') { msg += '\n'; } msg += __('Unachieved service counts:'); msg += '\n'; invalidMinServices.forEach(s => { msg += sprintf( __( `- service ${s.name} expects at ${s.minCount} least configured hosts\n` ) ); }); invalidMaxServices.forEach(s => { msg += sprintf( __( `- service ${s.name} expects no more than ${s.axCount} configured hosts\n` ) ); }); } return { validateResult: result, validateMsg: msg, }; } componentDidMount() { const { data: { mode, appDefinition, hosts, ansibleVarsAll, appDefinitionUrl, supportedPlugins, }, initApplicationInstance, deleteApplicationInstanceHost, activateEditApplicationInstanceHost, changeEditApplicationInstanceHost, openForemanParameterSelectionModal, openAnsibleParameterSelectionModal, loadApplicationDefinition, } = this.props; if (mode === 'editInstance') { loadApplicationDefinition(appDefinition.id, { url: appDefinitionUrl }); } const alreadyDeployedMsg = __( 'This is an already deployed host. Changing the parameters is not possible!' ); const inlineEditButtonsFormatter = inlineEditFormatterFactory({ isEditing: additionalData => this.props.editMode, renderValue: (value, additionalData) => ( {additionalData.rowData.isExistingHost === true ? ( ) : ( )}   {additionalData.rowData.isExistingHost === false ? ( ) : ( )}