bc95cee35925c8aa341dd33c67ef719d8ea740d6
[sdc.git] /
1 /*
2  * Copyright © 2016-2018 European Support Limited
3  *
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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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 or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 import React from 'react';
17 import i18n from 'nfvo-utils/i18n/i18n.js';
18
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';
23
24 const GeneralSection = ({
25     onDataChanged,
26     displayName,
27     description,
28     isReadOnlyMode,
29     genericFieldInfo,
30     isManual,
31     dataMap,
32     onQDataChanged,
33     qgenericFieldInfo
34 }) => (
35     <GridSection title={i18n('General')}>
36         {/* disabled until backend will be ready to implement it
37                         <div className='validation-input-wrapper'>
38                         <div className='form-group'>
39                         <label className='control-label'>{i18n('Name')}</label>
40                         <div>{name}</div>
41                         </div>
42                         </div>
43
44                 */}
45         <GridItem>
46             <Input
47                 data-test-id="name"
48                 label={i18n('Name')}
49                 value={displayName}
50                 disabled={!isManual || isReadOnlyMode}
51                 type="text"
52             />
53             {!isManual && (
54                 <Input
55                     data-test-id="vfcCode"
56                     label={i18n('Naming Code')}
57                     disabled={isReadOnlyMode}
58                     type="text"
59                     onChange={nfcFunction =>
60                         onQDataChanged({ 'general/nfcNamingCode': nfcFunction })
61                     }
62                     isValid={qgenericFieldInfo['general/nfcNamingCode'].isValid}
63                     errorText={
64                         qgenericFieldInfo['general/nfcNamingCode'].errorText
65                     }
66                     value={dataMap['general/nfcNamingCode']}
67                 />
68             )}
69             <Input
70                 data-test-id="nfcFunction"
71                 label={i18n('Function')}
72                 disabled={isReadOnlyMode}
73                 type="text"
74                 onChange={nfcFunction =>
75                     onQDataChanged({ 'general/nfcFunction': nfcFunction })
76                 }
77                 isValid={qgenericFieldInfo['general/nfcFunction'].isValid}
78                 errorText={qgenericFieldInfo['general/nfcFunction'].errorText}
79                 value={dataMap['general/nfcFunction']}
80             />
81         </GridItem>
82         <GridItem colSpan={2}>
83             <Input
84                 label={i18n('Description')}
85                 isValid={genericFieldInfo.description.isValid}
86                 errorText={genericFieldInfo.description.errorText}
87                 onChange={description => onDataChanged({ description })}
88                 disabled={isReadOnlyMode}
89                 value={description}
90                 groupClassName="multi-line-textarea"
91                 data-test-id="description"
92                 type="textarea"
93             />
94         </GridItem>
95         <GridItem />
96     </GridSection>
97 );
98
99 const HypervisorSection = ({ dataMap, onQDataChanged, qgenericFieldInfo }) => (
100     <GridSection title={i18n('Hypervisor')}>
101         <GridItem>
102             <Input
103                 data-test-id="hypervisor"
104                 label={i18n('Supported Hypervisors')}
105                 type="select"
106                 className="input-options-select"
107                 groupClassName="bootstrap-input-options"
108                 isValid={
109                     qgenericFieldInfo['general/hypervisor/hypervisor'].isValid
110                 }
111                 errorText={
112                     qgenericFieldInfo['general/hypervisor/hypervisor'].errorText
113                 }
114                 value={dataMap['general/hypervisor/hypervisor']}
115                 onChange={e => {
116                     const selectedIndex = e.target.selectedIndex;
117                     const val = e.target.options[selectedIndex].value;
118                     onQDataChanged({ 'general/hypervisor/hypervisor': val });
119                 }}>
120                 <option key="placeholder" value="">
121                     {i18n('Select...')}
122                 </option>
123                 {qgenericFieldInfo['general/hypervisor/hypervisor'].enum.map(
124                     hv => (
125                         <option value={hv.enum} key={hv.enum}>
126                             {hv.title}
127                         </option>
128                     )
129                 )}
130             </Input>
131         </GridItem>
132         <GridItem colSpan={2}>
133             <Input
134                 data-test-id="drivers"
135                 onChange={driver =>
136                     onQDataChanged({ 'general/hypervisor/drivers': driver })
137                 }
138                 label={i18n('Hypervisor Drivers')}
139                 type="text"
140                 isValid={
141                     qgenericFieldInfo['general/hypervisor/drivers'].isValid
142                 }
143                 errorText={
144                     qgenericFieldInfo['general/hypervisor/drivers'].errorText
145                 }
146                 value={dataMap['general/hypervisor/drivers']}
147             />
148         </GridItem>
149         <GridItem colSpan={3}>
150             <Input
151                 data-test-id="containerFeaturesDescription"
152                 label={i18n('Describe Container Features')}
153                 type="textarea"
154                 onChange={containerFeaturesDescription =>
155                     onQDataChanged({
156                         'general/hypervisor/containerFeaturesDescription': containerFeaturesDescription
157                     })
158                 }
159                 isValid={
160                     qgenericFieldInfo[
161                         'general/hypervisor/containerFeaturesDescription'
162                     ].isValid
163                 }
164                 errorText={
165                     qgenericFieldInfo[
166                         'general/hypervisor/containerFeaturesDescription'
167                     ].errorText
168                 }
169                 value={
170                     dataMap['general/hypervisor/containerFeaturesDescription']
171                 }
172             />
173         </GridItem>
174     </GridSection>
175 );
176
177 const ImageSection = ({ dataMap, onQDataChanged, qgenericFieldInfo }) => (
178     <GridSection title={i18n('Disk')}>
179         <GridItem>
180             <Input
181                 data-test-id="bootDiskSizePerVM"
182                 onChange={bootDiskSizePerVM =>
183                     onQDataChanged({
184                         'general/disk/bootDiskSizePerVM': bootDiskSizePerVM
185                     })
186                 }
187                 label={i18n('Size of boot disk per VM (GB)')}
188                 type="number"
189                 isValid={
190                     qgenericFieldInfo['general/disk/bootDiskSizePerVM'].isValid
191                 }
192                 errorText={
193                     qgenericFieldInfo['general/disk/bootDiskSizePerVM']
194                         .errorText
195                 }
196                 value={dataMap['general/disk/bootDiskSizePerVM']}
197             />
198         </GridItem>
199         <GridItem>
200             <Input
201                 data-test-id="ephemeralDiskSizePerVM"
202                 onChange={ephemeralDiskSizePerVM =>
203                     onQDataChanged({
204                         'general/disk/ephemeralDiskSizePerVM': ephemeralDiskSizePerVM
205                     })
206                 }
207                 label={i18n('Size of ephemeral disk per VM (GB)')}
208                 type="number"
209                 isValid={
210                     qgenericFieldInfo['general/disk/ephemeralDiskSizePerVM']
211                         .isValid
212                 }
213                 errorText={
214                     qgenericFieldInfo['general/disk/ephemeralDiskSizePerVM']
215                         .errorText
216                 }
217                 value={dataMap['general/disk/ephemeralDiskSizePerVM']}
218             />
219         </GridItem>
220     </GridSection>
221 );
222
223 const RecoverySection = ({ dataMap, onQDataChanged, qgenericFieldInfo }) => (
224     <GridSection title={i18n('Recovery')}>
225         <GridItem>
226             <Input
227                 data-test-id="pointObjective"
228                 label={i18n('VM Recovery Point Objective (Minutes)')}
229                 type="number"
230                 onChange={pointObjective =>
231                     onQDataChanged({
232                         'general/recovery/pointObjective': pointObjective
233                     })
234                 }
235                 isValid={
236                     qgenericFieldInfo['general/recovery/pointObjective'].isValid
237                 }
238                 errorText={
239                     qgenericFieldInfo['general/recovery/pointObjective']
240                         .errorText
241                 }
242                 value={dataMap['general/recovery/pointObjective']}
243             />
244         </GridItem>
245         <GridItem>
246             <Input
247                 data-test-id="timeObjective"
248                 label={i18n('VM Recovery Time Objective (Minutes)')}
249                 type="number"
250                 onChange={timeObjective =>
251                     onQDataChanged({
252                         'general/recovery/timeObjective': timeObjective
253                     })
254                 }
255                 isValid={
256                     qgenericFieldInfo['general/recovery/timeObjective'].isValid
257                 }
258                 errorText={
259                     qgenericFieldInfo['general/recovery/timeObjective']
260                         .errorText
261                 }
262                 value={dataMap['general/recovery/timeObjective']}
263             />
264             <div className="empty-two-col" />
265         </GridItem>
266         <GridItem colSpan={2} />
267         <GridItem colSpan={2}>
268             <Input
269                 data-test-id="vmProcessFailuresHandling"
270                 className="textarea"
271                 label={i18n('How are in VM process failures handled?')}
272                 type="textarea"
273                 onChange={vmProcessFailuresHandling =>
274                     onQDataChanged({
275                         'general/recovery/vmProcessFailuresHandling': vmProcessFailuresHandling
276                     })
277                 }
278                 isValid={
279                     qgenericFieldInfo[
280                         'general/recovery/vmProcessFailuresHandling'
281                     ].isValid
282                 }
283                 errorText={
284                     qgenericFieldInfo[
285                         'general/recovery/vmProcessFailuresHandling'
286                     ].errorText
287                 }
288                 value={dataMap['general/recovery/vmProcessFailuresHandling']}
289             />
290             <div className="empty-two-col" />
291         </GridItem>
292         {/** disabled until backend will be ready to implement it
293                         <div className='row'>
294                         <div className='col-md-3'>
295                         <Input
296                         label={i18n('VM Recovery Document')}
297                         type='text'
298                         pointer='/general/recovery/VMRecoveryDocument'/>
299                         </div>
300                         </div>
301                         */}
302     </GridSection>
303 );
304
305 const DNSConfigurationSection = ({
306     dataMap,
307     onQDataChanged,
308     qgenericFieldInfo
309 }) => (
310     <GridSection title={i18n('DNS Configuration')}>
311         <GridItem colSpan={2}>
312             <Input
313                 data-test-id="dnsConfiguration"
314                 label={i18n(
315                     'Do you have a need for DNS as a Service? Please describe.'
316                 )}
317                 type="textarea"
318                 onChange={dnsConfiguration =>
319                     onQDataChanged({
320                         'general/dnsConfiguration': dnsConfiguration
321                     })
322                 }
323                 isValid={qgenericFieldInfo['general/dnsConfiguration'].isValid}
324                 errorText={
325                     qgenericFieldInfo['general/dnsConfiguration'].errorText
326                 }
327                 value={dataMap['general/dnsConfiguration']}
328             />
329         </GridItem>
330     </GridSection>
331 );
332
333 const CloneSection = ({ dataMap, onQDataChanged, qgenericFieldInfo }) => (
334     <GridSection title={i18n('Clone')}>
335         <GridItem colSpan={2}>
336             <Input
337                 data-test-id="vmCloneUsage"
338                 label={i18n('Describe VM Clone Use')}
339                 type="textarea"
340                 onChange={vmCloneUsage =>
341                     onQDataChanged({ 'general/vmCloneUsage': vmCloneUsage })
342                 }
343                 isValid={qgenericFieldInfo['general/vmCloneUsage'].isValid}
344                 errorText={qgenericFieldInfo['general/vmCloneUsage'].errorText}
345                 value={dataMap['general/vmCloneUsage']}
346             />
347         </GridItem>
348     </GridSection>
349 );
350
351 class SoftwareProductComponentsGeneralView extends React.Component {
352     render() {
353         let {
354             isManual,
355             onQDataChanged,
356             onDataChanged,
357             genericFieldInfo,
358             dataMap,
359             qGenericFieldInfo,
360             componentData: { displayName, vfcCode, description },
361             isReadOnlyMode
362         } = this.props;
363         return (
364             <div className="vsp-components-general">
365                 <div className="general-data">
366                     {genericFieldInfo &&
367                         qGenericFieldInfo && (
368                             <Form
369                                 isValid={this.props.isFormValid}
370                                 formReady={null}
371                                 isReadOnlyMode={isReadOnlyMode}
372                                 onValidityChanged={isValidityData =>
373                                     this.props.onValidityChanged(isValidityData)
374                                 }
375                                 hasButtons={false}>
376                                 <GeneralSection
377                                     onDataChanged={onDataChanged}
378                                     displayName={displayName}
379                                     vfcCode={vfcCode}
380                                     description={description}
381                                     isManual={isManual}
382                                     isReadOnlyMode={isReadOnlyMode}
383                                     genericFieldInfo={genericFieldInfo}
384                                     dataMap={dataMap}
385                                     onQDataChanged={onQDataChanged}
386                                     qgenericFieldInfo={qGenericFieldInfo}
387                                 />
388                                 <HypervisorSection
389                                     onQDataChanged={onQDataChanged}
390                                     dataMap={dataMap}
391                                     qgenericFieldInfo={qGenericFieldInfo}
392                                 />
393                                 <ImageSection
394                                     onQDataChanged={onQDataChanged}
395                                     dataMap={dataMap}
396                                     qgenericFieldInfo={qGenericFieldInfo}
397                                 />
398                                 <RecoverySection
399                                     onQDataChanged={onQDataChanged}
400                                     dataMap={dataMap}
401                                     qgenericFieldInfo={qGenericFieldInfo}
402                                 />
403                                 <DNSConfigurationSection
404                                     onQDataChanged={onQDataChanged}
405                                     dataMap={dataMap}
406                                     qgenericFieldInfo={qGenericFieldInfo}
407                                 />
408                                 <CloneSection
409                                     onQDataChanged={onQDataChanged}
410                                     dataMap={dataMap}
411                                     qgenericFieldInfo={qGenericFieldInfo}
412                                 />
413                             </Form>
414                         )}
415                 </div>
416             </div>
417         );
418     }
419
420     save() {
421         let { onSubmit, componentData, qdata } = this.props;
422         return onSubmit({ componentData, qdata });
423     }
424 }
425
426 export default SoftwareProductComponentsGeneralView;