import React, { useState } from 'react' import PropTypes from 'prop-types'; import { Icon, Button, } from 'patternfly-react'; import * as resolve from 'table-resolver'; import ForemanModal from 'foremanReact/components/ForemanModal'; import Select from 'foremanReact/components/common/forms/Select'; import ParameterSelection from '../ParameterSelection'; import AddTableEntry from '../common/AddTableEntry'; import DeleteTableEntry from '../common/DeleteTableEntry'; import RailsData from '../common/RailsData'; import EasyHeaderFormatter from '../common/EasyHeaderFormatter'; import AppDefinitionSelector from './components/AppDefinitionSelector'; import ServiceCounter from './components/ServiceCounter'; import { arrayToObject } 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); } validateParameters() { let result = true; let msg = ""; this.props.hosts.forEach(h => { if (h.parameters.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: \n"; invalidMinServices.map(s => { msg += "- service "+ s.name +" expects at least "+ s.minCount +" configured hosts" }); invalidMaxServices.map(s => { msg += "- service "+ s.name +" expects no more than "+ s.maxCount +" configured hosts" }); } if (result === false) { window.alert(msg); } return result; } componentDidMount() { const { data: { mode, appDefinition, hosts, ansibleVarsAll, appDefinitionUrl }, initApplicationInstance, addApplicationInstanceHost, deleteApplicationInstanceHost, activateEditApplicationInstanceHost, changeEditApplicationInstanceHost, openForemanParameterSelectionModal, openAnsibleParameterSelectionModal, loadApplicationDefinition, } = this.props; if (mode === 'editInstance') { loadApplicationDefinition(appDefinition.id, { url: appDefinitionUrl }); } const inlineEditButtonsFormatter = inlineEditFormatterFactory({ isEditing: additionalData => this.props.editMode, renderValue: (value, additionalData) => (