2 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
13 * or implied. See the License for the specific language governing
14 * permissions and limitations under the License.
16 import React from 'react';
17 import i18n from 'nfvo-utils/i18n/i18n.js';
19 import Input from 'nfvo-components/input/validation/Input.jsx';
20 import Form from 'nfvo-components/input/validation/Form.jsx';
21 import GridSection from 'nfvo-components/grid/GridSection.jsx';
22 import GridItem from 'nfvo-components/grid/GridItem.jsx';
24 const GeneralSection = ({onDataChanged, displayName, vfcCode, nfcFunction, description, isReadOnlyMode, genericFieldInfo, isManual}) => (
25 <GridSection title={i18n('General')}>
26 {/* disabled until backend will be ready to implement it
27 <div className='validation-input-wrapper'>
28 <div className='form-group'>
29 <label className='control-label'>{i18n('Name')}</label>
40 disabled={!isManual || isReadOnlyMode}
43 data-test-id='vfcCode'
44 label={i18n('Naming Code')}
46 isValid={genericFieldInfo.vfcCode.isValid}
47 errorText={genericFieldInfo.vfcCode.errorText}
48 onChange={vfcCode => onDataChanged({vfcCode})}
49 disabled={isReadOnlyMode}
52 data-test-id='nfcFunction'
53 label={i18n('Function')}
55 isValid={genericFieldInfo.nfcFunction.isValid}
56 errorText={genericFieldInfo.nfcFunction.errorText}
57 onChange={nfcFunction => onDataChanged({nfcFunction})}
58 disabled={isReadOnlyMode}
61 <GridItem colSpan={2}>
63 label={i18n('Description')}
64 isValid={genericFieldInfo.description.isValid}
65 errorText={genericFieldInfo.description.errorText}
66 onChange={description => onDataChanged({description})}
67 disabled={isReadOnlyMode}
69 groupClassName='multi-line-textarea'
70 data-test-id='description'
77 const HypervisorSection = ({dataMap, onQDataChanged, qgenericFieldInfo}) => (
78 <GridSection title={i18n('Hypervisor')}>
81 data-test-id='hypervisor'
82 label={i18n('Supported Hypervisors')}
84 className='input-options-select'
85 groupClassName='bootstrap-input-options'
86 isValid={qgenericFieldInfo['general/hypervisor/hypervisor'].isValid}
87 errorText={qgenericFieldInfo['general/hypervisor/hypervisor'].errorText}
88 value={dataMap['general/hypervisor/hypervisor']}
90 const selectedIndex = e.target.selectedIndex;
91 const val = e.target.options[selectedIndex].value;
92 onQDataChanged({'general/hypervisor/hypervisor' : val});}
94 <option key='placeholder' value=''>{i18n('Select...')}</option>
95 {qgenericFieldInfo['general/hypervisor/hypervisor'].enum.map(hv => <option value={hv.enum} key={hv.enum}>{hv.title}</option>)}
98 <GridItem colSpan={2}>
100 data-test-id='drivers'
101 onChange={(driver) => onQDataChanged({'general/hypervisor/drivers' : driver})}
102 label={i18n('Hypervisor Drivers')}
104 isValid={qgenericFieldInfo['general/hypervisor/drivers'].isValid}
105 errorText={qgenericFieldInfo['general/hypervisor/drivers'].errorText}
106 value={dataMap['general/hypervisor/drivers']}/>
108 <GridItem colSpan={3}>
110 data-test-id='containerFeaturesDescription'
111 label={i18n('Describe Container Features')}
113 onChange={(containerFeaturesDescription) => onQDataChanged({'general/hypervisor/containerFeaturesDescription' : containerFeaturesDescription})}
114 isValid={qgenericFieldInfo['general/hypervisor/containerFeaturesDescription'].isValid}
115 errorText={qgenericFieldInfo['general/hypervisor/containerFeaturesDescription'].errorText}
116 value={dataMap['general/hypervisor/containerFeaturesDescription']}/>
121 const ImageSection = ({dataMap, onQDataChanged, qgenericFieldInfo}) => (
122 <GridSection title={i18n('Disk')}>
125 data-test-id='bootDiskSizePerVM'
126 onChange={(bootDiskSizePerVM) => onQDataChanged({'general/disk/bootDiskSizePerVM' : bootDiskSizePerVM})}
127 label={i18n('Size of boot disk per VM (GB)')}
129 isValid={qgenericFieldInfo['general/disk/bootDiskSizePerVM'].isValid}
130 errorText={qgenericFieldInfo['general/disk/bootDiskSizePerVM'].errorText}
131 value={dataMap['general/disk/bootDiskSizePerVM']}/>
135 data-test-id='ephemeralDiskSizePerVM'
136 onChange={(ephemeralDiskSizePerVM) => onQDataChanged({'general/disk/ephemeralDiskSizePerVM' : ephemeralDiskSizePerVM})}
137 label={i18n('Size of ephemeral disk per VM (GB)')}
139 isValid={qgenericFieldInfo['general/disk/ephemeralDiskSizePerVM'].isValid}
140 errorText={qgenericFieldInfo['general/disk/ephemeralDiskSizePerVM'].errorText}
141 value={dataMap['general/disk/ephemeralDiskSizePerVM']}/>
146 const RecoverySection = ({dataMap, onQDataChanged, qgenericFieldInfo}) => (
147 <GridSection title={i18n('Recovery')}>
150 data-test-id='pointObjective'
151 label={i18n('VM Recovery Point Objective (Minutes)')}
153 onChange={(pointObjective) => onQDataChanged({'general/recovery/pointObjective' : pointObjective})}
154 isValid={qgenericFieldInfo['general/recovery/pointObjective'].isValid}
155 errorText={qgenericFieldInfo['general/recovery/pointObjective'].errorText}
156 value={dataMap['general/recovery/pointObjective']}/>
160 data-test-id='timeObjective'
161 label={i18n('VM Recovery Time Objective (Minutes)')}
163 onChange={(timeObjective) => onQDataChanged({'general/recovery/timeObjective' : timeObjective})}
164 isValid={qgenericFieldInfo['general/recovery/timeObjective'].isValid}
165 errorText={qgenericFieldInfo['general/recovery/timeObjective'].errorText}
166 value={dataMap['general/recovery/timeObjective']}/>
167 <div className='empty-two-col' />
169 <GridItem colSpan={2} />
170 <GridItem colSpan={2}>
172 data-test-id='vmProcessFailuresHandling'
174 label={i18n('How are in VM process failures handled?')}
176 onChange={(vmProcessFailuresHandling) => onQDataChanged({'general/recovery/vmProcessFailuresHandling' : vmProcessFailuresHandling})}
177 isValid={qgenericFieldInfo['general/recovery/vmProcessFailuresHandling'].isValid}
178 errorText={qgenericFieldInfo['general/recovery/vmProcessFailuresHandling'].errorText}
179 value={dataMap['general/recovery/vmProcessFailuresHandling']}/>
180 <div className='empty-two-col' />
184 /** disabled until backend will be ready to implement it
185 <div className='row'>
186 <div className='col-md-3'>
188 label={i18n('VM Recovery Document')}
190 pointer='/general/recovery/VMRecoveryDocument'/>
198 const DNSConfigurationSection = ({dataMap, onQDataChanged, qgenericFieldInfo}) => (
199 <GridSection title={i18n('DNS Configuration')}>
200 <GridItem colSpan={2}>
202 data-test-id='dnsConfiguration'
203 label={i18n('Do you have a need for DNS as a Service? Please describe.')}
205 onChange={(dnsConfiguration) => onQDataChanged({'general/dnsConfiguration' : dnsConfiguration})}
206 isValid={qgenericFieldInfo['general/dnsConfiguration'].isValid}
207 errorText={qgenericFieldInfo['general/dnsConfiguration'].errorText}
208 value={dataMap['general/dnsConfiguration']}/>
213 const CloneSection = ({dataMap, onQDataChanged, qgenericFieldInfo}) => (
214 <GridSection title={i18n('Clone')}>
215 <GridItem colSpan={2}>
217 data-test-id='vmCloneUsage'
218 label={i18n('Describe VM Clone Use')}
220 onChange={(vmCloneUsage) => onQDataChanged({'general/vmCloneUsage' : vmCloneUsage})}
221 isValid={qgenericFieldInfo['general/vmCloneUsage'].isValid}
222 errorText={qgenericFieldInfo['general/vmCloneUsage'].errorText}
223 value={dataMap['general/vmCloneUsage']}/>
228 class SoftwareProductComponentsGeneralView extends React.Component {
231 let {isManual, onQDataChanged, onDataChanged, genericFieldInfo, dataMap, qGenericFieldInfo, componentData: {displayName, vfcCode, nfcFunction, description}, isReadOnlyMode} = this.props;
233 <div className='vsp-components-general'>
234 <div className='general-data'>
235 {genericFieldInfo && qGenericFieldInfo && <Form
236 isValid={this.props.isFormValid}
238 isReadOnlyMode={isReadOnlyMode}
239 onValidityChanged={(isValidityData) => this.props.onValidityChanged(isValidityData)}
242 onDataChanged={onDataChanged}
243 displayName={displayName}
245 nfcFunction={nfcFunction}
246 description={description}
248 isReadOnlyMode={isReadOnlyMode}
249 genericFieldInfo={genericFieldInfo}/>
250 <HypervisorSection onQDataChanged={onQDataChanged} dataMap={dataMap} qgenericFieldInfo={qGenericFieldInfo}/>
251 <ImageSection onQDataChanged={onQDataChanged} dataMap={dataMap} qgenericFieldInfo={qGenericFieldInfo}/>
252 <RecoverySection onQDataChanged={onQDataChanged} dataMap={dataMap} qgenericFieldInfo={qGenericFieldInfo}/>
253 <DNSConfigurationSection onQDataChanged={onQDataChanged} dataMap={dataMap} qgenericFieldInfo={qGenericFieldInfo}/>
254 <CloneSection onQDataChanged={onQDataChanged} dataMap={dataMap} qgenericFieldInfo={qGenericFieldInfo}/>
262 let {onSubmit, componentData, qdata} = this.props;
263 return onSubmit({componentData, qdata});
267 export default SoftwareProductComponentsGeneralView;