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 = ({
34 <GridSection title={i18n('General')}>
35 {/* disabled until backend will be ready to implement it
36 <div className='validation-input-wrapper'>
37 <div className='form-group'>
38 <label className='control-label'>{i18n('Name')}</label>
49 disabled={!isManual || isReadOnlyMode}
54 data-test-id="vfcCode"
55 label={i18n('Naming Code')}
57 isValid={genericFieldInfo.vfcCode.isValid}
58 errorText={genericFieldInfo.vfcCode.errorText}
59 onChange={vfcCode => onDataChanged({ vfcCode })}
60 disabled={isReadOnlyMode}
65 data-test-id="nfcFunction"
66 label={i18n('Function')}
68 isValid={genericFieldInfo.nfcFunction.isValid}
69 errorText={genericFieldInfo.nfcFunction.errorText}
70 onChange={nfcFunction => onDataChanged({ nfcFunction })}
71 disabled={isReadOnlyMode}
75 <GridItem colSpan={2}>
77 label={i18n('Description')}
78 isValid={genericFieldInfo.description.isValid}
79 errorText={genericFieldInfo.description.errorText}
80 onChange={description => onDataChanged({ description })}
81 disabled={isReadOnlyMode}
83 groupClassName="multi-line-textarea"
84 data-test-id="description"
92 const HypervisorSection = ({ dataMap, onQDataChanged, qgenericFieldInfo }) => (
93 <GridSection title={i18n('Hypervisor')}>
96 data-test-id="hypervisor"
97 label={i18n('Supported Hypervisors')}
99 className="input-options-select"
100 groupClassName="bootstrap-input-options"
102 qgenericFieldInfo['general/hypervisor/hypervisor'].isValid
105 qgenericFieldInfo['general/hypervisor/hypervisor'].errorText
107 value={dataMap['general/hypervisor/hypervisor']}
109 const selectedIndex = e.target.selectedIndex;
110 const val = e.target.options[selectedIndex].value;
111 onQDataChanged({ 'general/hypervisor/hypervisor': val });
113 <option key="placeholder" value="">
116 {qgenericFieldInfo['general/hypervisor/hypervisor'].enum.map(
118 <option value={hv.enum} key={hv.enum}>
125 <GridItem colSpan={2}>
127 data-test-id="drivers"
129 onQDataChanged({ 'general/hypervisor/drivers': driver })
131 label={i18n('Hypervisor Drivers')}
134 qgenericFieldInfo['general/hypervisor/drivers'].isValid
137 qgenericFieldInfo['general/hypervisor/drivers'].errorText
139 value={dataMap['general/hypervisor/drivers']}
142 <GridItem colSpan={3}>
144 data-test-id="containerFeaturesDescription"
145 label={i18n('Describe Container Features')}
147 onChange={containerFeaturesDescription =>
149 'general/hypervisor/containerFeaturesDescription': containerFeaturesDescription
154 'general/hypervisor/containerFeaturesDescription'
159 'general/hypervisor/containerFeaturesDescription'
163 dataMap['general/hypervisor/containerFeaturesDescription']
170 const ImageSection = ({ dataMap, onQDataChanged, qgenericFieldInfo }) => (
171 <GridSection title={i18n('Disk')}>
174 data-test-id="bootDiskSizePerVM"
175 onChange={bootDiskSizePerVM =>
177 'general/disk/bootDiskSizePerVM': bootDiskSizePerVM
180 label={i18n('Size of boot disk per VM (GB)')}
183 qgenericFieldInfo['general/disk/bootDiskSizePerVM'].isValid
186 qgenericFieldInfo['general/disk/bootDiskSizePerVM']
189 value={dataMap['general/disk/bootDiskSizePerVM']}
194 data-test-id="ephemeralDiskSizePerVM"
195 onChange={ephemeralDiskSizePerVM =>
197 'general/disk/ephemeralDiskSizePerVM': ephemeralDiskSizePerVM
200 label={i18n('Size of ephemeral disk per VM (GB)')}
203 qgenericFieldInfo['general/disk/ephemeralDiskSizePerVM']
207 qgenericFieldInfo['general/disk/ephemeralDiskSizePerVM']
210 value={dataMap['general/disk/ephemeralDiskSizePerVM']}
216 const RecoverySection = ({ dataMap, onQDataChanged, qgenericFieldInfo }) => (
217 <GridSection title={i18n('Recovery')}>
220 data-test-id="pointObjective"
221 label={i18n('VM Recovery Point Objective (Minutes)')}
223 onChange={pointObjective =>
225 'general/recovery/pointObjective': pointObjective
229 qgenericFieldInfo['general/recovery/pointObjective'].isValid
232 qgenericFieldInfo['general/recovery/pointObjective']
235 value={dataMap['general/recovery/pointObjective']}
240 data-test-id="timeObjective"
241 label={i18n('VM Recovery Time Objective (Minutes)')}
243 onChange={timeObjective =>
245 'general/recovery/timeObjective': timeObjective
249 qgenericFieldInfo['general/recovery/timeObjective'].isValid
252 qgenericFieldInfo['general/recovery/timeObjective']
255 value={dataMap['general/recovery/timeObjective']}
257 <div className="empty-two-col" />
259 <GridItem colSpan={2} />
260 <GridItem colSpan={2}>
262 data-test-id="vmProcessFailuresHandling"
264 label={i18n('How are in VM process failures handled?')}
266 onChange={vmProcessFailuresHandling =>
268 'general/recovery/vmProcessFailuresHandling': vmProcessFailuresHandling
273 'general/recovery/vmProcessFailuresHandling'
278 'general/recovery/vmProcessFailuresHandling'
281 value={dataMap['general/recovery/vmProcessFailuresHandling']}
283 <div className="empty-two-col" />
285 {/** disabled until backend will be ready to implement it
286 <div className='row'>
287 <div className='col-md-3'>
289 label={i18n('VM Recovery Document')}
291 pointer='/general/recovery/VMRecoveryDocument'/>
298 const DNSConfigurationSection = ({
303 <GridSection title={i18n('DNS Configuration')}>
304 <GridItem colSpan={2}>
306 data-test-id="dnsConfiguration"
308 'Do you have a need for DNS as a Service? Please describe.'
311 onChange={dnsConfiguration =>
313 'general/dnsConfiguration': dnsConfiguration
316 isValid={qgenericFieldInfo['general/dnsConfiguration'].isValid}
318 qgenericFieldInfo['general/dnsConfiguration'].errorText
320 value={dataMap['general/dnsConfiguration']}
326 const CloneSection = ({ dataMap, onQDataChanged, qgenericFieldInfo }) => (
327 <GridSection title={i18n('Clone')}>
328 <GridItem colSpan={2}>
330 data-test-id="vmCloneUsage"
331 label={i18n('Describe VM Clone Use')}
333 onChange={vmCloneUsage =>
334 onQDataChanged({ 'general/vmCloneUsage': vmCloneUsage })
336 isValid={qgenericFieldInfo['general/vmCloneUsage'].isValid}
337 errorText={qgenericFieldInfo['general/vmCloneUsage'].errorText}
338 value={dataMap['general/vmCloneUsage']}
344 class SoftwareProductComponentsGeneralView extends React.Component {
353 componentData: { displayName, vfcCode, nfcFunction, description },
357 <div className="vsp-components-general">
358 <div className="general-data">
360 qGenericFieldInfo && (
362 isValid={this.props.isFormValid}
364 isReadOnlyMode={isReadOnlyMode}
365 onValidityChanged={isValidityData =>
366 this.props.onValidityChanged(isValidityData)
370 onDataChanged={onDataChanged}
371 displayName={displayName}
373 nfcFunction={nfcFunction}
374 description={description}
376 isReadOnlyMode={isReadOnlyMode}
377 genericFieldInfo={genericFieldInfo}
380 onQDataChanged={onQDataChanged}
382 qgenericFieldInfo={qGenericFieldInfo}
385 onQDataChanged={onQDataChanged}
387 qgenericFieldInfo={qGenericFieldInfo}
390 onQDataChanged={onQDataChanged}
392 qgenericFieldInfo={qGenericFieldInfo}
394 <DNSConfigurationSection
395 onQDataChanged={onQDataChanged}
397 qgenericFieldInfo={qGenericFieldInfo}
400 onQDataChanged={onQDataChanged}
402 qgenericFieldInfo={qGenericFieldInfo}
412 let { onSubmit, componentData, qdata } = this.props;
413 return onSubmit({ componentData, qdata });
417 export default SoftwareProductComponentsGeneralView;