blob: d6da7177978c3c453766c6a3694f5f36ad342788 [file] [log] [blame]
Dixsie Wolmersbb81d552020-02-26 19:52:28 -06001<template>
2 <b-container fluid="xl">
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -05003 <page-title :description="$t('pageNetworkSettings.pageDescription')" />
4 <page-section :section-title="$t('pageNetworkSettings.interface')">
Dixsie Wolmersbb81d552020-02-26 19:52:28 -06005 <b-row>
6 <b-col lg="3">
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -05007 <b-form-group
8 label-for="interface-select"
9 :label="$t('pageNetworkSettings.form.networkInterface')"
10 >
Dixsie Wolmersbb81d552020-02-26 19:52:28 -060011 <b-form-select
12 id="interface-select"
13 v-model="selectedInterfaceIndex"
Mateusz Gapski471f2e02020-07-27 14:43:26 +020014 :disabled="loading"
Dixsie Wolmers55888a12020-07-01 11:21:47 -050015 data-test-id="networkSettings-select-interface"
Dixsie Wolmersbb81d552020-02-26 19:52:28 -060016 :options="interfaceSelectOptions"
17 @change="selectInterface"
18 >
19 </b-form-select>
20 </b-form-group>
21 </b-col>
22 </b-row>
23 </page-section>
24 <b-form novalidate @submit.prevent="submitForm">
Mateusz Gapski471f2e02020-07-27 14:43:26 +020025 <b-form-group :disabled="loading">
26 <page-section :section-title="$t('pageNetworkSettings.system')">
27 <b-row>
28 <b-col lg="3">
29 <b-form-group
30 :label="$t('pageNetworkSettings.form.defaultGateway')"
31 label-for="default-gateway"
32 >
Dixsie Wolmersbb81d552020-02-26 19:52:28 -060033 <b-form-input
Mateusz Gapski471f2e02020-07-27 14:43:26 +020034 id="default-gateway"
35 v-model.trim="form.gateway"
36 data-test-id="networkSettings-input-gateway"
37 type="text"
Mateusz Gapski471f2e02020-07-27 14:43:26 +020038 :state="getValidationState($v.form.gateway)"
39 @change="$v.form.gateway.$touch()"
Dixsie Wolmersbb81d552020-02-26 19:52:28 -060040 />
41 <b-form-invalid-feedback role="alert">
Mateusz Gapski471f2e02020-07-27 14:43:26 +020042 <div v-if="!$v.form.gateway.required">
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -050043 {{ $t('global.form.fieldRequired') }}
Dixsie Wolmersbb81d552020-02-26 19:52:28 -060044 </div>
Dixsie71aa4552021-03-26 12:38:03 -050045 <div v-if="!$v.form.gateway.ipAddress">
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -050046 {{ $t('global.form.invalidFormat') }}
Dixsie Wolmersbb81d552020-02-26 19:52:28 -060047 </div>
48 </b-form-invalid-feedback>
Mateusz Gapski471f2e02020-07-27 14:43:26 +020049 </b-form-group>
50 </b-col>
51 <b-col lg="3">
52 <b-form-group
53 :label="$t('pageNetworkSettings.form.hostname')"
54 label-for="hostname-field"
55 >
Dixsie Wolmersbb81d552020-02-26 19:52:28 -060056 <b-form-input
Mateusz Gapski471f2e02020-07-27 14:43:26 +020057 id="hostname-field"
58 v-model.trim="form.hostname"
59 data-test-id="networkSettings-input-hostname"
60 type="text"
61 :state="getValidationState($v.form.hostname)"
62 @change="$v.form.hostname.$touch()"
Dixsie Wolmersbb81d552020-02-26 19:52:28 -060063 />
64 <b-form-invalid-feedback role="alert">
Mateusz Gapski471f2e02020-07-27 14:43:26 +020065 <div v-if="!$v.form.hostname.required">
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -050066 {{ $t('global.form.fieldRequired') }}
Dixsie Wolmersbb81d552020-02-26 19:52:28 -060067 </div>
Mateusz Gapski471f2e02020-07-27 14:43:26 +020068 <div v-if="!$v.form.hostname.validateHostname">
69 {{
70 $t('global.form.lengthMustBeBetween', { min: 1, max: 64 })
71 }}
72 </div>
73 </b-form-invalid-feedback>
74 </b-form-group>
75 </b-col>
76 <b-col lg="3">
77 <b-form-group
78 :label="$t('pageNetworkSettings.form.macAddress')"
79 label-for="mac-address"
80 >
81 <b-form-input
82 id="mac-address"
83 v-model.trim="form.macAddress"
84 data-test-id="networkSettings-input-macAddress"
85 type="text"
86 :state="getValidationState($v.form.macAddress)"
87 @change="$v.form.macAddress.$touch()"
88 />
89 <b-form-invalid-feedback role="alert">
90 <div v-if="!$v.form.macAddress.required">
91 {{ $t('global.form.fieldRequired') }}
92 </div>
Dixsie71aa4552021-03-26 12:38:03 -050093 <div v-if="!$v.form.macAddress.macAddress">
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -050094 {{ $t('global.form.invalidFormat') }}
Dixsie Wolmersbb81d552020-02-26 19:52:28 -060095 </div>
96 </b-form-invalid-feedback>
Mateusz Gapski471f2e02020-07-27 14:43:26 +020097 </b-form-group>
98 </b-col>
99 </b-row>
100 </page-section>
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600101 <page-section :section-title="$t('pageNetworkSettings.ipv4')">
102 <b-form-group :label="$t('pageNetworkSettings.ipv4Configuration')">
103 <b-form-text id="enable-secure-help-block">
104 {{ $t('pageNetworkSettings.ipv4Helper') }}
105 </b-form-text>
106 <b-form-radio
107 v-model="form.dhcpEnabled"
108 name="dhcp-radio"
109 :value="true"
110 @change="onChangeIpv4Config"
111 >
112 {{ $t('pageNetworkSettings.dhcp') }}
113 </b-form-radio>
114 <b-form-radio
115 v-model="form.dhcpEnabled"
116 name="static-radio"
117 :value="false"
118 @change="onChangeIpv4Config"
119 >
120 {{ $t('pageNetworkSettings.static') }}
121 </b-form-radio>
122 </b-form-group>
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200123 <b-row>
124 <b-col lg="9" class="mb-3">
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600125 <h3 class="h4">
126 {{ $t('pageNetworkSettings.dhcp') }}
127 </h3>
128 <b-table
129 responsive="md"
130 hover
131 :fields="ipv4DhcpTableFields"
132 :items="form.ipv4DhcpTableItems"
133 :empty-text="$t('global.table.emptyMessage')"
134 class="mb-0"
135 show-empty
136 >
137 <template #cell(Address)="{ item, index }">
138 <b-form-input
139 v-model.trim="item.Address"
140 :data-test-id="`networkSettings-input-dhcpIpv4-${index}`"
141 :aria-label="
142 $t('pageNetworkSettings.table.dhcpIpv4AddressRow') +
143 ' ' +
144 (index + 1)
145 "
146 readonly
147 />
148 </template>
149 <template #cell(SubnetMask)="{ item, index }">
150 <b-form-input
151 v-model.trim="item.SubnetMask"
152 :data-test-id="`networkSettings-input-subnetMask-${index}`"
153 :aria-label="
154 $t('pageNetworkSettings.table.dhcpIpv4SubnetRow') +
155 ' ' +
156 (index + 1)
157 "
158 readonly
159 />
160 </template>
161 <template #cell(actions)="{ item, index }">
162 <table-row-action
163 v-for="(action, actionIndex) in item.actions"
164 :key="actionIndex"
165 :value="action.value"
166 :title="action.title"
167 :enabled="false"
168 @click-table-action="
169 onDeleteIpv4StaticTableRow($event, index)
170 "
171 >
172 <template #icon>
173 <icon-trashcan v-if="action.value === 'delete'" />
174 </template>
175 </table-row-action>
176 </template>
177 </b-table>
178 </b-col>
179 <b-col lg="9" class="mb-3">
180 <h3 class="h4">
181 {{ $t('pageNetworkSettings.static') }}
182 </h3>
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200183 <b-table
184 responsive="md"
Sukanya Pandeyfde429e2020-09-14 20:48:39 +0530185 hover
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200186 :fields="ipv4StaticTableFields"
187 :items="form.ipv4StaticTableItems"
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600188 :empty-text="$t('global.table.emptyMessage')"
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200189 class="mb-0"
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600190 show-empty
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200191 >
Derick Montague602e98a2020-10-21 16:20:00 -0500192 <template #cell(Address)="{ item, index }">
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200193 <b-form-input
194 v-model.trim="item.Address"
195 :data-test-id="`networkSettings-input-staticIpv4-${index}`"
196 :aria-label="
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600197 $t('pageNetworkSettings.table.staticIpv4AddressRow') +
Derick Montague602e98a2020-10-21 16:20:00 -0500198 ' ' +
199 (index + 1)
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200200 "
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200201 :state="
202 getValidationState(
203 $v.form.ipv4StaticTableItems.$each.$iter[index].Address
204 )
205 "
206 @change="
207 $v.form.ipv4StaticTableItems.$each.$iter[
208 index
209 ].Address.$touch()
210 "
211 />
212 <b-form-invalid-feedback role="alert">
213 <div
214 v-if="
215 !$v.form.ipv4StaticTableItems.$each.$iter[index].Address
216 .required
217 "
218 >
219 {{ $t('global.form.fieldRequired') }}
220 </div>
221 <div
222 v-if="
223 !$v.form.ipv4StaticTableItems.$each.$iter[index].Address
Dixsie71aa4552021-03-26 12:38:03 -0500224 .ipAddress
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200225 "
226 >
227 {{ $t('global.form.invalidFormat') }}
228 </div>
229 </b-form-invalid-feedback>
230 </template>
Derick Montague602e98a2020-10-21 16:20:00 -0500231 <template #cell(SubnetMask)="{ item, index }">
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200232 <b-form-input
233 v-model.trim="item.SubnetMask"
234 :data-test-id="`networkSettings-input-subnetMask-${index}`"
235 :aria-label="
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600236 $t('pageNetworkSettings.table.staticIpv4SubnetRow') +
Derick Montague602e98a2020-10-21 16:20:00 -0500237 ' ' +
238 (index + 1)
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200239 "
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200240 :state="
241 getValidationState(
242 $v.form.ipv4StaticTableItems.$each.$iter[index]
243 .SubnetMask
244 )
245 "
246 @change="
247 $v.form.ipv4StaticTableItems.$each.$iter[
248 index
249 ].SubnetMask.$touch()
250 "
251 />
252 <b-form-invalid-feedback role="alert">
253 <div
254 v-if="
255 !$v.form.ipv4StaticTableItems.$each.$iter[index]
256 .SubnetMask.required
257 "
258 >
259 {{ $t('global.form.fieldRequired') }}
260 </div>
261 <div
262 v-if="
263 !$v.form.ipv4StaticTableItems.$each.$iter[index]
Dixsie71aa4552021-03-26 12:38:03 -0500264 .SubnetMask.ipAddress
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200265 "
266 >
267 {{ $t('global.form.invalidFormat') }}
268 </div>
269 </b-form-invalid-feedback>
270 </template>
Derick Montague602e98a2020-10-21 16:20:00 -0500271 <template #cell(actions)="{ item, index }">
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200272 <table-row-action
273 v-for="(action, actionIndex) in item.actions"
274 :key="actionIndex"
275 :value="action.value"
276 :title="action.title"
Sukanya Pandeyedb8a772020-10-29 11:33:42 +0530277 @click-table-action="
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200278 onDeleteIpv4StaticTableRow($event, index)
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600279 "
280 >
Derick Montague602e98a2020-10-21 16:20:00 -0500281 <template #icon>
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200282 <icon-trashcan v-if="action.value === 'delete'" />
283 </template>
284 </table-row-action>
285 </template>
286 </b-table>
287 <b-button variant="link" @click="addIpv4StaticTableRow">
288 <icon-add />
289 {{ $t('pageNetworkSettings.table.addStaticIpv4Address') }}
290 </b-button>
291 </b-col>
292 </b-row>
293 </page-section>
294 <page-section :section-title="$t('pageNetworkSettings.staticDns')">
295 <b-row>
296 <b-col lg="4" class="mb-3">
297 <b-table
298 responsive
Sukanya Pandeyfde429e2020-09-14 20:48:39 +0530299 hover
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200300 :fields="dnsTableFields"
301 :items="form.dnsStaticTableItems"
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600302 :empty-text="$t('global.table.emptyMessage')"
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200303 class="mb-0"
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600304 show-empty
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200305 >
Derick Montague602e98a2020-10-21 16:20:00 -0500306 <template #cell(address)="{ item, index }">
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200307 <b-form-input
308 v-model.trim="item.address"
309 :data-test-id="`networkSettings-input-dnsAddress-${index}`"
310 :aria-label="
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600311 $t('pageNetworkSettings.table.staticDnsRow') +
Derick Montague602e98a2020-10-21 16:20:00 -0500312 ' ' +
313 (index + 1)
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600314 "
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200315 :state="
316 getValidationState(
317 $v.form.dnsStaticTableItems.$each.$iter[index].address
318 )
319 "
320 @change="
321 $v.form.dnsStaticTableItems.$each.$iter[
322 index
323 ].address.$touch()
324 "
325 />
326 <b-form-invalid-feedback role="alert">
327 <div
328 v-if="
329 !$v.form.dnsStaticTableItems.$each.$iter[index].address
330 .required
331 "
332 >
333 {{ $t('global.form.fieldRequired') }}
334 </div>
335 <div
336 v-if="
337 !$v.form.dnsStaticTableItems.$each.$iter[index].address
Dixsie71aa4552021-03-26 12:38:03 -0500338 .ipAddress
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200339 "
340 >
341 {{ $t('global.form.invalidFormat') }}
342 </div>
343 </b-form-invalid-feedback>
344 </template>
Derick Montague602e98a2020-10-21 16:20:00 -0500345 <template #cell(actions)="{ item, index }">
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200346 <table-row-action
347 v-for="(action, actionIndex) in item.actions"
348 :key="actionIndex"
349 :value="action.value"
350 :title="action.title"
Sukanya Pandeyedb8a772020-10-29 11:33:42 +0530351 @click-table-action="onDeleteDnsTableRow($event, index)"
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600352 >
Derick Montague602e98a2020-10-21 16:20:00 -0500353 <template #icon>
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200354 <icon-trashcan v-if="action.value === 'delete'" />
355 </template>
356 </table-row-action>
357 </template>
358 </b-table>
359 <b-button variant="link" @click="addDnsTableRow">
360 <icon-add /> {{ $t('pageNetworkSettings.table.addDns') }}
361 </b-button>
362 </b-col>
363 </b-row>
364 </page-section>
365 <b-button
366 variant="primary"
367 type="submit"
368 data-test-id="networkSettings-button-saveNetworkSettings"
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200369 >
370 {{ $t('global.action.saveSettings') }}
371 </b-button>
372 </b-form-group>
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600373 </b-form>
374 </b-container>
375</template>
376
377<script>
378import IconTrashcan from '@carbon/icons-vue/es/trash-can/20';
379import IconAdd from '@carbon/icons-vue/es/add--alt/20';
380import BVToastMixin from '@/components/Mixins/BVToastMixin';
Yoshie Muranakad73f4962020-12-09 08:52:23 -0800381import LoadingBarMixin, { loading } from '@/components/Mixins/LoadingBarMixin';
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600382import PageSection from '@/components/Global/PageSection';
383import PageTitle from '@/components/Global/PageTitle';
384import TableRowAction from '@/components/Global/TableRowAction';
385import VuelidateMixin from '@/components/Mixins/VuelidateMixin';
386import { mapState } from 'vuex';
Dixsie71aa4552021-03-26 12:38:03 -0500387import {
388 required,
389 helpers,
390 ipAddress,
391 macAddress,
392} from 'vuelidate/lib/validators';
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600393
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600394// Hostname pattern
395const validateHostname = helpers.regex('validateHostname', /^\S{0,64}$/);
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600396
397export default {
398 name: 'NetworkSettings',
399 components: {
400 PageTitle,
401 PageSection,
402 TableRowAction,
403 IconTrashcan,
Derick Montague602e98a2020-10-21 16:20:00 -0500404 IconAdd,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600405 },
406 mixins: [BVToastMixin, VuelidateMixin, LoadingBarMixin],
Derick Montague602e98a2020-10-21 16:20:00 -0500407 beforeRouteLeave(to, from, next) {
408 this.hideLoader();
409 next();
410 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600411 data() {
412 return {
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600413 ipv4DhcpTableFields: [
414 {
415 key: 'Address',
416 label: this.$t('pageNetworkSettings.table.ipAddress'),
417 },
418 {
419 key: 'SubnetMask',
420 label: this.$t('pageNetworkSettings.table.subnet'),
421 },
422 { key: 'actions', label: '', tdClass: 'text-right' },
423 ],
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600424 ipv4StaticTableFields: [
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -0500425 {
426 key: 'Address',
Derick Montague602e98a2020-10-21 16:20:00 -0500427 label: this.$t('pageNetworkSettings.table.ipAddress'),
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -0500428 },
429 {
430 key: 'SubnetMask',
Derick Montague602e98a2020-10-21 16:20:00 -0500431 label: this.$t('pageNetworkSettings.table.subnet'),
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -0500432 },
Derick Montague602e98a2020-10-21 16:20:00 -0500433 { key: 'actions', label: '', tdClass: 'text-right' },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600434 ],
435 dnsTableFields: [
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -0500436 {
437 key: 'address',
Derick Montague602e98a2020-10-21 16:20:00 -0500438 label: this.$t('pageNetworkSettings.table.ipAddress'),
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -0500439 },
Derick Montague602e98a2020-10-21 16:20:00 -0500440 { key: 'actions', label: '', tdClass: 'text-right' },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600441 ],
442 selectedInterfaceIndex: 0,
443 selectedInterface: {},
444 form: {
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600445 dhcpEnabled: null,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600446 gateway: '',
447 hostname: '',
448 macAddress: '',
449 ipv4StaticTableItems: [],
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600450 ipv4DhcpTableItems: [],
Derick Montague602e98a2020-10-21 16:20:00 -0500451 dnsStaticTableItems: [],
452 },
Yoshie Muranakad73f4962020-12-09 08:52:23 -0800453 loading,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600454 };
455 },
456 validations() {
457 return {
458 form: {
Dixsie71aa4552021-03-26 12:38:03 -0500459 gateway: { required, ipAddress },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600460 hostname: { required, validateHostname },
461 ipv4StaticTableItems: {
462 $each: {
463 Address: {
464 required,
Dixsie71aa4552021-03-26 12:38:03 -0500465 ipAddress,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600466 },
467 SubnetMask: {
468 required,
Dixsie71aa4552021-03-26 12:38:03 -0500469 ipAddress,
Derick Montague602e98a2020-10-21 16:20:00 -0500470 },
471 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600472 },
Dixsie71aa4552021-03-26 12:38:03 -0500473 macAddress: { required, macAddress: macAddress() },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600474 dnsStaticTableItems: {
475 $each: {
476 address: {
477 required,
Dixsie71aa4552021-03-26 12:38:03 -0500478 ipAddress,
Derick Montague602e98a2020-10-21 16:20:00 -0500479 },
480 },
481 },
482 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600483 };
484 },
485 computed: {
486 ...mapState('networkSettings', [
487 'ethernetData',
488 'interfaceOptions',
Derick Montague602e98a2020-10-21 16:20:00 -0500489 'defaultGateway',
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600490 ]),
491 interfaceSelectOptions() {
492 return this.interfaceOptions.map((option, index) => {
493 return {
494 text: option,
Derick Montague602e98a2020-10-21 16:20:00 -0500495 value: index,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600496 };
497 });
Derick Montague602e98a2020-10-21 16:20:00 -0500498 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600499 },
500 watch: {
Derick Montague602e98a2020-10-21 16:20:00 -0500501 ethernetData: function () {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600502 this.selectInterface();
Derick Montague602e98a2020-10-21 16:20:00 -0500503 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600504 },
505 created() {
506 this.startLoader();
507 this.$store
508 .dispatch('networkSettings/getEthernetData')
509 .finally(() => this.endLoader());
510 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600511 methods: {
512 selectInterface() {
513 this.selectedInterface = this.ethernetData[this.selectedInterfaceIndex];
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600514 this.getIpv4DhcpTableItems();
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600515 this.getIpv4StaticTableItems();
516 this.getDnsStaticTableItems();
517 this.getInterfaceSettings();
518 },
519 getInterfaceSettings() {
520 this.form.gateway = this.defaultGateway;
521 this.form.hostname = this.selectedInterface.HostName;
522 this.form.macAddress = this.selectedInterface.MACAddress;
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600523 this.form.dhcpEnabled = this.selectedInterface.DHCPv4.DHCPEnabled;
524 },
525 onChangeIpv4Config(value) {
526 this.form.dhcpEnabled = value;
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600527 },
528 getDnsStaticTableItems() {
529 const dns = this.selectedInterface.StaticNameServers || [];
Derick Montague602e98a2020-10-21 16:20:00 -0500530 this.form.dnsStaticTableItems = dns.map((server) => {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600531 return {
532 address: server,
533 actions: [
534 {
535 value: 'delete',
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600536 enabled: this.form.dhcpEnabled,
Derick Montague602e98a2020-10-21 16:20:00 -0500537 title: this.$t('pageNetworkSettings.table.deleteDns'),
538 },
539 ],
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600540 };
541 });
542 },
543 addDnsTableRow() {
544 this.$v.form.dnsStaticTableItems.$touch();
545 this.form.dnsStaticTableItems.push({
546 address: '',
547 actions: [
548 {
549 value: 'delete',
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600550 enabled: this.form.dhcpEnabled,
Derick Montague602e98a2020-10-21 16:20:00 -0500551 title: this.$t('pageNetworkSettings.table.deleteDns'),
552 },
553 ],
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600554 });
555 },
556 deleteDnsTableRow(index) {
557 this.$v.form.dnsStaticTableItems.$touch();
558 this.form.dnsStaticTableItems.splice(index, 1);
559 },
560 onDeleteDnsTableRow(action, row) {
561 this.deleteDnsTableRow(row);
562 },
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600563 getIpv4DhcpTableItems() {
564 const addresses = this.selectedInterface.IPv4Addresses || [];
565 this.form.ipv4DhcpTableItems = addresses
566 .filter((ipv4) => ipv4.AddressOrigin === 'DHCP')
567 .map((ipv4) => {
568 return {
569 Address: ipv4.Address,
570 SubnetMask: ipv4.SubnetMask,
571 actions: [
572 {
573 value: 'delete',
574 enabled: false,
575 title: this.$t('pageNetworkSettings.table.deleteDhcpIpv4'),
576 },
577 ],
578 };
579 });
580 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600581 getIpv4StaticTableItems() {
582 const addresses = this.selectedInterface.IPv4StaticAddresses || [];
Derick Montague602e98a2020-10-21 16:20:00 -0500583 this.form.ipv4StaticTableItems = addresses.map((ipv4) => {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600584 return {
585 Address: ipv4.Address,
586 SubnetMask: ipv4.SubnetMask,
587 actions: [
588 {
589 value: 'delete',
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600590 enabled: this.form.dhcpEnabled,
Derick Montague602e98a2020-10-21 16:20:00 -0500591 title: this.$t('pageNetworkSettings.table.deleteStaticIpv4'),
592 },
593 ],
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600594 };
595 });
596 },
597 addIpv4StaticTableRow() {
598 this.$v.form.ipv4StaticTableItems.$touch();
599 this.form.ipv4StaticTableItems.push({
600 Address: '',
601 SubnetMask: '',
602 actions: [
603 {
604 value: 'delete',
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600605 enabled: this.form.dhcpEnabled,
Derick Montague602e98a2020-10-21 16:20:00 -0500606 title: this.$t('pageNetworkSettings.table.deleteStaticIpv4'),
607 },
608 ],
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600609 });
610 },
611 deleteIpv4StaticTableRow(index) {
612 this.$v.form.ipv4StaticTableItems.$touch();
613 this.form.ipv4StaticTableItems.splice(index, 1);
614 },
615 onDeleteIpv4StaticTableRow(action, row) {
616 this.deleteIpv4StaticTableRow(row);
617 },
618 submitForm() {
Dixsie Wolmers4d1dbb52020-08-24 21:43:25 -0500619 this.$v.$touch();
620 if (this.$v.$invalid) return;
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600621 this.startLoader();
622 let networkInterfaceSelected = this.selectedInterface;
623 let selectedInterfaceIndex = this.selectedInterfaceIndex;
624 let interfaceId = networkInterfaceSelected.Id;
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600625 let isDhcpEnabled = this.form.dhcpEnabled;
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600626 let macAddress = this.form.macAddress;
627 let hostname = this.form.hostname;
628 let networkSettingsForm = {
629 interfaceId,
630 hostname,
631 macAddress,
632 selectedInterfaceIndex,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600633 };
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600634 // Enabling DHCP without any available IP addresses will bring network down
635 if (this.form.ipv4DhcpTableItems.length) {
636 networkSettingsForm.isDhcpEnabled = isDhcpEnabled;
637 } else {
638 networkSettingsForm.isDhcpEnabled = false;
639 this.errorToast(
640 this.$t('pageNetworkSettings.toast.errorSaveDhcpSettings')
641 );
642 }
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600643 networkSettingsForm.staticIpv4 = this.form.ipv4StaticTableItems.map(
Derick Montague602e98a2020-10-21 16:20:00 -0500644 (updateIpv4) => {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600645 delete updateIpv4.actions;
646 updateIpv4.Gateway = this.form.gateway;
647 return updateIpv4;
648 }
649 );
650 networkSettingsForm.staticNameServers = this.form.dnsStaticTableItems.map(
Derick Montague602e98a2020-10-21 16:20:00 -0500651 (updateDns) => {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600652 return updateDns.address;
653 }
654 );
655 this.$store
656 .dispatch(
657 'networkSettings/updateInterfaceSettings',
658 networkSettingsForm
659 )
Derick Montague602e98a2020-10-21 16:20:00 -0500660 .then((success) => {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600661 this.successToast(success);
662 })
663 .catch(({ message }) => this.errorToast(message))
664 .finally(() => {
665 this.$v.form.$reset();
666 this.endLoader();
667 });
Derick Montague602e98a2020-10-21 16:20:00 -0500668 },
669 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600670};
671</script>