blob: f007a94c7613afbb1680e3034d3b545a35e90bda [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>
Mateusz Gapski471f2e02020-07-27 14:43:26 +020045 <div v-if="!$v.form.gateway.validateAddress">
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>
93 <div v-if="!$v.form.macAddress.validateMacAddress">
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
224 .validateAddress
225 "
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]
264 .SubnetMask.validateAddress
265 "
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
338 .validateAddress
339 "
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';
387import { required, helpers } from 'vuelidate/lib/validators';
388
389// IP address, gateway and subnet pattern
390const validateAddress = helpers.regex(
391 'validateAddress',
392 /^(?=.*[^.]$)((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.?){4}$/
393);
394// Hostname pattern
395const validateHostname = helpers.regex('validateHostname', /^\S{0,64}$/);
396// MAC address pattern
397const validateMacAddress = helpers.regex(
398 'validateMacAddress',
399 /^(?:[0-9A-Fa-f]{2}([:-]?)[0-9A-Fa-f]{2})(?:(?:\1|\.)(?:[0-9A-Fa-f]{2}([:-]?)[0-9A-Fa-f]{2})){2}$/
400);
401
402export default {
403 name: 'NetworkSettings',
404 components: {
405 PageTitle,
406 PageSection,
407 TableRowAction,
408 IconTrashcan,
Derick Montague602e98a2020-10-21 16:20:00 -0500409 IconAdd,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600410 },
411 mixins: [BVToastMixin, VuelidateMixin, LoadingBarMixin],
Derick Montague602e98a2020-10-21 16:20:00 -0500412 beforeRouteLeave(to, from, next) {
413 this.hideLoader();
414 next();
415 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600416 data() {
417 return {
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600418 ipv4DhcpTableFields: [
419 {
420 key: 'Address',
421 label: this.$t('pageNetworkSettings.table.ipAddress'),
422 },
423 {
424 key: 'SubnetMask',
425 label: this.$t('pageNetworkSettings.table.subnet'),
426 },
427 { key: 'actions', label: '', tdClass: 'text-right' },
428 ],
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600429 ipv4StaticTableFields: [
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -0500430 {
431 key: 'Address',
Derick Montague602e98a2020-10-21 16:20:00 -0500432 label: this.$t('pageNetworkSettings.table.ipAddress'),
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -0500433 },
434 {
435 key: 'SubnetMask',
Derick Montague602e98a2020-10-21 16:20:00 -0500436 label: this.$t('pageNetworkSettings.table.subnet'),
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -0500437 },
Derick Montague602e98a2020-10-21 16:20:00 -0500438 { key: 'actions', label: '', tdClass: 'text-right' },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600439 ],
440 dnsTableFields: [
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -0500441 {
442 key: 'address',
Derick Montague602e98a2020-10-21 16:20:00 -0500443 label: this.$t('pageNetworkSettings.table.ipAddress'),
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -0500444 },
Derick Montague602e98a2020-10-21 16:20:00 -0500445 { key: 'actions', label: '', tdClass: 'text-right' },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600446 ],
447 selectedInterfaceIndex: 0,
448 selectedInterface: {},
449 form: {
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600450 dhcpEnabled: null,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600451 gateway: '',
452 hostname: '',
453 macAddress: '',
454 ipv4StaticTableItems: [],
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600455 ipv4DhcpTableItems: [],
Derick Montague602e98a2020-10-21 16:20:00 -0500456 dnsStaticTableItems: [],
457 },
Yoshie Muranakad73f4962020-12-09 08:52:23 -0800458 loading,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600459 };
460 },
461 validations() {
462 return {
463 form: {
464 gateway: { required, validateAddress },
465 hostname: { required, validateHostname },
466 ipv4StaticTableItems: {
467 $each: {
468 Address: {
469 required,
Derick Montague602e98a2020-10-21 16:20:00 -0500470 validateAddress,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600471 },
472 SubnetMask: {
473 required,
Derick Montague602e98a2020-10-21 16:20:00 -0500474 validateAddress,
475 },
476 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600477 },
478 macAddress: { required, validateMacAddress },
479 dnsStaticTableItems: {
480 $each: {
481 address: {
482 required,
Derick Montague602e98a2020-10-21 16:20:00 -0500483 validateAddress,
484 },
485 },
486 },
487 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600488 };
489 },
490 computed: {
491 ...mapState('networkSettings', [
492 'ethernetData',
493 'interfaceOptions',
Derick Montague602e98a2020-10-21 16:20:00 -0500494 'defaultGateway',
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600495 ]),
496 interfaceSelectOptions() {
497 return this.interfaceOptions.map((option, index) => {
498 return {
499 text: option,
Derick Montague602e98a2020-10-21 16:20:00 -0500500 value: index,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600501 };
502 });
Derick Montague602e98a2020-10-21 16:20:00 -0500503 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600504 },
505 watch: {
Derick Montague602e98a2020-10-21 16:20:00 -0500506 ethernetData: function () {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600507 this.selectInterface();
Derick Montague602e98a2020-10-21 16:20:00 -0500508 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600509 },
510 created() {
511 this.startLoader();
512 this.$store
513 .dispatch('networkSettings/getEthernetData')
514 .finally(() => this.endLoader());
515 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600516 methods: {
517 selectInterface() {
518 this.selectedInterface = this.ethernetData[this.selectedInterfaceIndex];
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600519 this.getIpv4DhcpTableItems();
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600520 this.getIpv4StaticTableItems();
521 this.getDnsStaticTableItems();
522 this.getInterfaceSettings();
523 },
524 getInterfaceSettings() {
525 this.form.gateway = this.defaultGateway;
526 this.form.hostname = this.selectedInterface.HostName;
527 this.form.macAddress = this.selectedInterface.MACAddress;
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600528 this.form.dhcpEnabled = this.selectedInterface.DHCPv4.DHCPEnabled;
529 },
530 onChangeIpv4Config(value) {
531 this.form.dhcpEnabled = value;
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600532 },
533 getDnsStaticTableItems() {
534 const dns = this.selectedInterface.StaticNameServers || [];
Derick Montague602e98a2020-10-21 16:20:00 -0500535 this.form.dnsStaticTableItems = dns.map((server) => {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600536 return {
537 address: server,
538 actions: [
539 {
540 value: 'delete',
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600541 enabled: this.form.dhcpEnabled,
Derick Montague602e98a2020-10-21 16:20:00 -0500542 title: this.$t('pageNetworkSettings.table.deleteDns'),
543 },
544 ],
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600545 };
546 });
547 },
548 addDnsTableRow() {
549 this.$v.form.dnsStaticTableItems.$touch();
550 this.form.dnsStaticTableItems.push({
551 address: '',
552 actions: [
553 {
554 value: 'delete',
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600555 enabled: this.form.dhcpEnabled,
Derick Montague602e98a2020-10-21 16:20:00 -0500556 title: this.$t('pageNetworkSettings.table.deleteDns'),
557 },
558 ],
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600559 });
560 },
561 deleteDnsTableRow(index) {
562 this.$v.form.dnsStaticTableItems.$touch();
563 this.form.dnsStaticTableItems.splice(index, 1);
564 },
565 onDeleteDnsTableRow(action, row) {
566 this.deleteDnsTableRow(row);
567 },
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600568 getIpv4DhcpTableItems() {
569 const addresses = this.selectedInterface.IPv4Addresses || [];
570 this.form.ipv4DhcpTableItems = addresses
571 .filter((ipv4) => ipv4.AddressOrigin === 'DHCP')
572 .map((ipv4) => {
573 return {
574 Address: ipv4.Address,
575 SubnetMask: ipv4.SubnetMask,
576 actions: [
577 {
578 value: 'delete',
579 enabled: false,
580 title: this.$t('pageNetworkSettings.table.deleteDhcpIpv4'),
581 },
582 ],
583 };
584 });
585 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600586 getIpv4StaticTableItems() {
587 const addresses = this.selectedInterface.IPv4StaticAddresses || [];
Derick Montague602e98a2020-10-21 16:20:00 -0500588 this.form.ipv4StaticTableItems = addresses.map((ipv4) => {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600589 return {
590 Address: ipv4.Address,
591 SubnetMask: ipv4.SubnetMask,
592 actions: [
593 {
594 value: 'delete',
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600595 enabled: this.form.dhcpEnabled,
Derick Montague602e98a2020-10-21 16:20:00 -0500596 title: this.$t('pageNetworkSettings.table.deleteStaticIpv4'),
597 },
598 ],
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600599 };
600 });
601 },
602 addIpv4StaticTableRow() {
603 this.$v.form.ipv4StaticTableItems.$touch();
604 this.form.ipv4StaticTableItems.push({
605 Address: '',
606 SubnetMask: '',
607 actions: [
608 {
609 value: 'delete',
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600610 enabled: this.form.dhcpEnabled,
Derick Montague602e98a2020-10-21 16:20:00 -0500611 title: this.$t('pageNetworkSettings.table.deleteStaticIpv4'),
612 },
613 ],
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600614 });
615 },
616 deleteIpv4StaticTableRow(index) {
617 this.$v.form.ipv4StaticTableItems.$touch();
618 this.form.ipv4StaticTableItems.splice(index, 1);
619 },
620 onDeleteIpv4StaticTableRow(action, row) {
621 this.deleteIpv4StaticTableRow(row);
622 },
623 submitForm() {
Dixsie Wolmers4d1dbb52020-08-24 21:43:25 -0500624 this.$v.$touch();
625 if (this.$v.$invalid) return;
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600626 this.startLoader();
627 let networkInterfaceSelected = this.selectedInterface;
628 let selectedInterfaceIndex = this.selectedInterfaceIndex;
629 let interfaceId = networkInterfaceSelected.Id;
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600630 let isDhcpEnabled = this.form.dhcpEnabled;
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600631 let macAddress = this.form.macAddress;
632 let hostname = this.form.hostname;
633 let networkSettingsForm = {
634 interfaceId,
635 hostname,
636 macAddress,
637 selectedInterfaceIndex,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600638 };
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600639 // Enabling DHCP without any available IP addresses will bring network down
640 if (this.form.ipv4DhcpTableItems.length) {
641 networkSettingsForm.isDhcpEnabled = isDhcpEnabled;
642 } else {
643 networkSettingsForm.isDhcpEnabled = false;
644 this.errorToast(
645 this.$t('pageNetworkSettings.toast.errorSaveDhcpSettings')
646 );
647 }
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600648 networkSettingsForm.staticIpv4 = this.form.ipv4StaticTableItems.map(
Derick Montague602e98a2020-10-21 16:20:00 -0500649 (updateIpv4) => {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600650 delete updateIpv4.actions;
651 updateIpv4.Gateway = this.form.gateway;
652 return updateIpv4;
653 }
654 );
655 networkSettingsForm.staticNameServers = this.form.dnsStaticTableItems.map(
Derick Montague602e98a2020-10-21 16:20:00 -0500656 (updateDns) => {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600657 return updateDns.address;
658 }
659 );
660 this.$store
661 .dispatch(
662 'networkSettings/updateInterfaceSettings',
663 networkSettingsForm
664 )
Derick Montague602e98a2020-10-21 16:20:00 -0500665 .then((success) => {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600666 this.successToast(success);
667 })
668 .catch(({ message }) => this.errorToast(message))
669 .finally(() => {
670 this.$v.form.$reset();
671 this.endLoader();
672 });
Derick Montague602e98a2020-10-21 16:20:00 -0500673 },
674 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600675};
676</script>