import React, { useState } from 'react' import PropTypes from 'prop-types'; import { Icon, Button, MessageDialog, } from 'patternfly-react'; import * as resolve from 'table-resolver'; 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 } from '../../helper'; import { EasyHeaderFormatter } from '../../helper'; import { Table, FormControl, inlineEditFormatterFactory, } from 'patternfly-react'; import { PARAMETER_SELECTION_PARAM_TYPE_FOREMAN, PARAMETER_SELECTION_PARAM_TYPE_ANSIBLE, } from '../ParameterSelection/ParameterSelectionConstants'; class ApplicationInstance extends React.Component { constructor(props) { super(props); } 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.map(s => { msg += sprintf( __(`- service ${s.name} expects at ${s.minCount} least configured hosts\n`) )}); invalidMaxServices.map(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, addApplicationInstanceHost, deleteApplicationInstanceHost, activateEditApplicationInstanceHost, changeEditApplicationInstanceHost, openForemanParameterSelectionModal, openAnsibleParameterSelectionModal, loadApplicationDefinition, } = this.props; if (mode === 'editInstance') { loadApplicationDefinition(appDefinition.id, { url: appDefinitionUrl }); } const already_deployed_msg = __("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 ? ( ) : ()}