blob: ab5003f86fc7f12157d7f81000892393178d0ef8 [file] [log] [blame]
Dixsie Wolmersbb81d552020-02-26 19:52:28 -06001<template>
2 <b-container fluid="xl">
Sandeepa Singhf67f7692021-07-19 18:04:18 +05303 <page-title :description="$t('pageNetwork.pageDescription')" />
4 <page-section :section-title="$t('pageNetwork.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"
Sandeepa Singhf67f7692021-07-19 18:04:18 +05309 :label="$t('pageNetwork.form.networkInterface')"
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -050010 >
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"
Sandeepa Singhf67f7692021-07-19 18:04:18 +053015 data-test-id="network-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">
Sandeepa Singhf67f7692021-07-19 18:04:18 +053026 <page-section :section-title="$t('pageNetwork.system')">
Mateusz Gapski471f2e02020-07-27 14:43:26 +020027 <b-row>
28 <b-col lg="3">
29 <b-form-group
Sandeepa Singhf67f7692021-07-19 18:04:18 +053030 :label="$t('pageNetwork.form.defaultGateway')"
Mateusz Gapski471f2e02020-07-27 14:43:26 +020031 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"
Sandeepa Singhf67f7692021-07-19 18:04:18 +053036 data-test-id="network-input-gateway"
Mateusz Gapski471f2e02020-07-27 14:43:26 +020037 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
Sandeepa Singhf67f7692021-07-19 18:04:18 +053053 :label="$t('pageNetwork.form.hostname')"
Mateusz Gapski471f2e02020-07-27 14:43:26 +020054 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"
Sandeepa Singhf67f7692021-07-19 18:04:18 +053059 data-test-id="network-input-hostname"
Mateusz Gapski471f2e02020-07-27 14:43:26 +020060 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
Sandeepa Singhf67f7692021-07-19 18:04:18 +053078 :label="$t('pageNetwork.form.macAddress')"
Mateusz Gapski471f2e02020-07-27 14:43:26 +020079 label-for="mac-address"
80 >
81 <b-form-input
82 id="mac-address"
83 v-model.trim="form.macAddress"
Sandeepa Singhf67f7692021-07-19 18:04:18 +053084 data-test-id="network-input-macAddress"
Mateusz Gapski471f2e02020-07-27 14:43:26 +020085 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>
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530101 <page-section :section-title="$t('pageNetwork.ipv4')">
102 <b-form-group :label="$t('pageNetwork.ipv4Configuration')">
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600103 <b-form-text id="enable-secure-help-block">
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530104 {{ $t('pageNetwork.ipv4Helper') }}
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600105 </b-form-text>
106 <b-form-radio
107 v-model="form.dhcpEnabled"
108 name="dhcp-radio"
109 :value="true"
110 @change="onChangeIpv4Config"
111 >
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530112 {{ $t('pageNetwork.dhcp') }}
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600113 </b-form-radio>
114 <b-form-radio
115 v-model="form.dhcpEnabled"
116 name="static-radio"
117 :value="false"
118 @change="onChangeIpv4Config"
119 >
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530120 {{ $t('pageNetwork.static') }}
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600121 </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">
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530126 {{ $t('pageNetwork.dhcp') }}
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600127 </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"
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530140 :data-test-id="`network-input-dhcpIpv4-${index}`"
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600141 :aria-label="
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530142 $t('pageNetwork.table.dhcpIpv4AddressRow') +
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600143 ' ' +
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"
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530152 :data-test-id="`network-input-subnetMask-${index}`"
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600153 :aria-label="
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530154 $t('pageNetwork.table.dhcpIpv4SubnetRow') +
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600155 ' ' +
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">
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530181 {{ $t('pageNetwork.static') }}
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600182 </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"
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530195 :data-test-id="`network-input-staticIpv4-${index}`"
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200196 :aria-label="
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530197 $t('pageNetwork.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"
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530234 :data-test-id="`network-input-subnetMask-${index}`"
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200235 :aria-label="
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530236 $t('pageNetwork.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 />
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530289 {{ $t('pageNetwork.table.addStaticIpv4Address') }}
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200290 </b-button>
291 </b-col>
292 </b-row>
293 </page-section>
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530294 <page-section :section-title="$t('pageNetwork.staticDns')">
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200295 <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"
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530309 :data-test-id="`network-input-dnsAddress-${index}`"
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200310 :aria-label="
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530311 $t('pageNetwork.table.staticDnsRow') + ' ' + (index + 1)
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600312 "
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200313 :state="
314 getValidationState(
315 $v.form.dnsStaticTableItems.$each.$iter[index].address
316 )
317 "
318 @change="
319 $v.form.dnsStaticTableItems.$each.$iter[
320 index
321 ].address.$touch()
322 "
323 />
324 <b-form-invalid-feedback role="alert">
325 <div
326 v-if="
327 !$v.form.dnsStaticTableItems.$each.$iter[index].address
328 .required
329 "
330 >
331 {{ $t('global.form.fieldRequired') }}
332 </div>
333 <div
334 v-if="
335 !$v.form.dnsStaticTableItems.$each.$iter[index].address
Dixsie71aa4552021-03-26 12:38:03 -0500336 .ipAddress
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200337 "
338 >
339 {{ $t('global.form.invalidFormat') }}
340 </div>
341 </b-form-invalid-feedback>
342 </template>
Derick Montague602e98a2020-10-21 16:20:00 -0500343 <template #cell(actions)="{ item, index }">
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200344 <table-row-action
345 v-for="(action, actionIndex) in item.actions"
346 :key="actionIndex"
347 :value="action.value"
348 :title="action.title"
Sukanya Pandeyedb8a772020-10-29 11:33:42 +0530349 @click-table-action="onDeleteDnsTableRow($event, index)"
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600350 >
Derick Montague602e98a2020-10-21 16:20:00 -0500351 <template #icon>
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200352 <icon-trashcan v-if="action.value === 'delete'" />
353 </template>
354 </table-row-action>
355 </template>
356 </b-table>
357 <b-button variant="link" @click="addDnsTableRow">
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530358 <icon-add /> {{ $t('pageNetwork.table.addDns') }}
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200359 </b-button>
360 </b-col>
361 </b-row>
362 </page-section>
363 <b-button
364 variant="primary"
365 type="submit"
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530366 data-test-id="network-button-saveNetworkSettings"
Mateusz Gapski471f2e02020-07-27 14:43:26 +0200367 >
368 {{ $t('global.action.saveSettings') }}
369 </b-button>
370 </b-form-group>
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600371 </b-form>
372 </b-container>
373</template>
374
375<script>
376import IconTrashcan from '@carbon/icons-vue/es/trash-can/20';
377import IconAdd from '@carbon/icons-vue/es/add--alt/20';
378import BVToastMixin from '@/components/Mixins/BVToastMixin';
Yoshie Muranakad73f4962020-12-09 08:52:23 -0800379import LoadingBarMixin, { loading } from '@/components/Mixins/LoadingBarMixin';
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600380import PageSection from '@/components/Global/PageSection';
381import PageTitle from '@/components/Global/PageTitle';
382import TableRowAction from '@/components/Global/TableRowAction';
383import VuelidateMixin from '@/components/Mixins/VuelidateMixin';
384import { mapState } from 'vuex';
Dixsie71aa4552021-03-26 12:38:03 -0500385import {
386 required,
387 helpers,
388 ipAddress,
389 macAddress,
390} from 'vuelidate/lib/validators';
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600391
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600392// Hostname pattern
393const validateHostname = helpers.regex('validateHostname', /^\S{0,64}$/);
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600394
395export default {
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530396 name: 'Network',
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600397 components: {
398 PageTitle,
399 PageSection,
400 TableRowAction,
401 IconTrashcan,
Derick Montague602e98a2020-10-21 16:20:00 -0500402 IconAdd,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600403 },
404 mixins: [BVToastMixin, VuelidateMixin, LoadingBarMixin],
Derick Montague602e98a2020-10-21 16:20:00 -0500405 beforeRouteLeave(to, from, next) {
406 this.hideLoader();
407 next();
408 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600409 data() {
410 return {
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600411 ipv4DhcpTableFields: [
412 {
413 key: 'Address',
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530414 label: this.$t('pageNetwork.table.ipAddress'),
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600415 },
416 {
417 key: 'SubnetMask',
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530418 label: this.$t('pageNetwork.table.subnet'),
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600419 },
420 { key: 'actions', label: '', tdClass: 'text-right' },
421 ],
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600422 ipv4StaticTableFields: [
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -0500423 {
424 key: 'Address',
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530425 label: this.$t('pageNetwork.table.ipAddress'),
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -0500426 },
427 {
428 key: 'SubnetMask',
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530429 label: this.$t('pageNetwork.table.subnet'),
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -0500430 },
Derick Montague602e98a2020-10-21 16:20:00 -0500431 { key: 'actions', label: '', tdClass: 'text-right' },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600432 ],
433 dnsTableFields: [
Dixsie Wolmerse3c9c092020-05-20 23:27:56 -0500434 {
435 key: 'address',
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530436 label: this.$t('pageNetwork.table.ipAddress'),
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 selectedInterfaceIndex: 0,
441 selectedInterface: {},
442 form: {
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600443 dhcpEnabled: null,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600444 gateway: '',
445 hostname: '',
446 macAddress: '',
447 ipv4StaticTableItems: [],
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600448 ipv4DhcpTableItems: [],
Derick Montague602e98a2020-10-21 16:20:00 -0500449 dnsStaticTableItems: [],
450 },
Yoshie Muranakad73f4962020-12-09 08:52:23 -0800451 loading,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600452 };
453 },
454 validations() {
455 return {
456 form: {
Dixsie71aa4552021-03-26 12:38:03 -0500457 gateway: { required, ipAddress },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600458 hostname: { required, validateHostname },
459 ipv4StaticTableItems: {
460 $each: {
461 Address: {
462 required,
Dixsie71aa4552021-03-26 12:38:03 -0500463 ipAddress,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600464 },
465 SubnetMask: {
466 required,
Dixsie71aa4552021-03-26 12:38:03 -0500467 ipAddress,
Derick Montague602e98a2020-10-21 16:20:00 -0500468 },
469 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600470 },
Dixsie71aa4552021-03-26 12:38:03 -0500471 macAddress: { required, macAddress: macAddress() },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600472 dnsStaticTableItems: {
473 $each: {
474 address: {
475 required,
Dixsie71aa4552021-03-26 12:38:03 -0500476 ipAddress,
Derick Montague602e98a2020-10-21 16:20:00 -0500477 },
478 },
479 },
480 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600481 };
482 },
483 computed: {
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530484 ...mapState('network', [
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600485 'ethernetData',
486 'interfaceOptions',
Derick Montague602e98a2020-10-21 16:20:00 -0500487 'defaultGateway',
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600488 ]),
489 interfaceSelectOptions() {
490 return this.interfaceOptions.map((option, index) => {
491 return {
492 text: option,
Derick Montague602e98a2020-10-21 16:20:00 -0500493 value: index,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600494 };
495 });
Derick Montague602e98a2020-10-21 16:20:00 -0500496 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600497 },
498 watch: {
Derick Montague602e98a2020-10-21 16:20:00 -0500499 ethernetData: function () {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600500 this.selectInterface();
Derick Montague602e98a2020-10-21 16:20:00 -0500501 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600502 },
503 created() {
504 this.startLoader();
505 this.$store
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530506 .dispatch('network/getEthernetData')
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600507 .finally(() => this.endLoader());
508 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600509 methods: {
510 selectInterface() {
511 this.selectedInterface = this.ethernetData[this.selectedInterfaceIndex];
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600512 this.getIpv4DhcpTableItems();
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600513 this.getIpv4StaticTableItems();
514 this.getDnsStaticTableItems();
515 this.getInterfaceSettings();
516 },
517 getInterfaceSettings() {
518 this.form.gateway = this.defaultGateway;
519 this.form.hostname = this.selectedInterface.HostName;
520 this.form.macAddress = this.selectedInterface.MACAddress;
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600521 this.form.dhcpEnabled = this.selectedInterface.DHCPv4.DHCPEnabled;
522 },
523 onChangeIpv4Config(value) {
524 this.form.dhcpEnabled = value;
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600525 },
526 getDnsStaticTableItems() {
527 const dns = this.selectedInterface.StaticNameServers || [];
Derick Montague602e98a2020-10-21 16:20:00 -0500528 this.form.dnsStaticTableItems = dns.map((server) => {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600529 return {
530 address: server,
531 actions: [
532 {
533 value: 'delete',
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600534 enabled: this.form.dhcpEnabled,
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530535 title: this.$t('pageNetwork.table.deleteDns'),
Derick Montague602e98a2020-10-21 16:20:00 -0500536 },
537 ],
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600538 };
539 });
540 },
541 addDnsTableRow() {
542 this.$v.form.dnsStaticTableItems.$touch();
543 this.form.dnsStaticTableItems.push({
544 address: '',
545 actions: [
546 {
547 value: 'delete',
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600548 enabled: this.form.dhcpEnabled,
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530549 title: this.$t('pageNetwork.table.deleteDns'),
Derick Montague602e98a2020-10-21 16:20:00 -0500550 },
551 ],
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600552 });
553 },
554 deleteDnsTableRow(index) {
555 this.$v.form.dnsStaticTableItems.$touch();
556 this.form.dnsStaticTableItems.splice(index, 1);
557 },
558 onDeleteDnsTableRow(action, row) {
559 this.deleteDnsTableRow(row);
560 },
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600561 getIpv4DhcpTableItems() {
562 const addresses = this.selectedInterface.IPv4Addresses || [];
563 this.form.ipv4DhcpTableItems = addresses
564 .filter((ipv4) => ipv4.AddressOrigin === 'DHCP')
565 .map((ipv4) => {
566 return {
567 Address: ipv4.Address,
568 SubnetMask: ipv4.SubnetMask,
569 actions: [
570 {
571 value: 'delete',
572 enabled: false,
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530573 title: this.$t('pageNetwork.table.deleteDhcpIpv4'),
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600574 },
575 ],
576 };
577 });
578 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600579 getIpv4StaticTableItems() {
580 const addresses = this.selectedInterface.IPv4StaticAddresses || [];
Derick Montague602e98a2020-10-21 16:20:00 -0500581 this.form.ipv4StaticTableItems = addresses.map((ipv4) => {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600582 return {
583 Address: ipv4.Address,
584 SubnetMask: ipv4.SubnetMask,
585 actions: [
586 {
587 value: 'delete',
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600588 enabled: this.form.dhcpEnabled,
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530589 title: this.$t('pageNetwork.table.deleteStaticIpv4'),
Derick Montague602e98a2020-10-21 16:20:00 -0500590 },
591 ],
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600592 };
593 });
594 },
595 addIpv4StaticTableRow() {
596 this.$v.form.ipv4StaticTableItems.$touch();
597 this.form.ipv4StaticTableItems.push({
598 Address: '',
599 SubnetMask: '',
600 actions: [
601 {
602 value: 'delete',
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600603 enabled: this.form.dhcpEnabled,
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530604 title: this.$t('pageNetwork.table.deleteStaticIpv4'),
Derick Montague602e98a2020-10-21 16:20:00 -0500605 },
606 ],
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600607 });
608 },
609 deleteIpv4StaticTableRow(index) {
610 this.$v.form.ipv4StaticTableItems.$touch();
611 this.form.ipv4StaticTableItems.splice(index, 1);
612 },
613 onDeleteIpv4StaticTableRow(action, row) {
614 this.deleteIpv4StaticTableRow(row);
615 },
616 submitForm() {
Dixsie Wolmers4d1dbb52020-08-24 21:43:25 -0500617 this.$v.$touch();
618 if (this.$v.$invalid) return;
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600619 this.startLoader();
620 let networkInterfaceSelected = this.selectedInterface;
621 let selectedInterfaceIndex = this.selectedInterfaceIndex;
622 let interfaceId = networkInterfaceSelected.Id;
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600623 let isDhcpEnabled = this.form.dhcpEnabled;
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600624 let macAddress = this.form.macAddress;
625 let hostname = this.form.hostname;
626 let networkSettingsForm = {
627 interfaceId,
628 hostname,
629 macAddress,
630 selectedInterfaceIndex,
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600631 };
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600632 // Enabling DHCP without any available IP addresses will bring network down
633 if (this.form.ipv4DhcpTableItems.length) {
634 networkSettingsForm.isDhcpEnabled = isDhcpEnabled;
635 } else {
636 networkSettingsForm.isDhcpEnabled = false;
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530637 this.errorToast(this.$t('pageNetwork.toast.errorSaveDhcpSettings'));
Dixsie Wolmers157d2ff2020-12-16 14:25:04 -0600638 }
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600639 networkSettingsForm.staticIpv4 = this.form.ipv4StaticTableItems.map(
Derick Montague602e98a2020-10-21 16:20:00 -0500640 (updateIpv4) => {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600641 delete updateIpv4.actions;
642 updateIpv4.Gateway = this.form.gateway;
643 return updateIpv4;
644 }
645 );
646 networkSettingsForm.staticNameServers = this.form.dnsStaticTableItems.map(
Derick Montague602e98a2020-10-21 16:20:00 -0500647 (updateDns) => {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600648 return updateDns.address;
649 }
650 );
651 this.$store
Sandeepa Singhf67f7692021-07-19 18:04:18 +0530652 .dispatch('network/updateInterfaceSettings', networkSettingsForm)
Derick Montague602e98a2020-10-21 16:20:00 -0500653 .then((success) => {
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600654 this.successToast(success);
655 })
656 .catch(({ message }) => this.errorToast(message))
657 .finally(() => {
658 this.$v.form.$reset();
659 this.endLoader();
660 });
Derick Montague602e98a2020-10-21 16:20:00 -0500661 },
662 },
Dixsie Wolmersbb81d552020-02-26 19:52:28 -0600663};
664</script>