/* * Copyright (C) 2021 Red Hat, Inc. * SPDX-License-Identifier: LGPL-2.1-or-later */ import React, { useState, useContext } from 'react'; import cockpit from 'cockpit'; import { Button } from "@patternfly/react-core/dist/esm/components/Button/index.js"; import { FormGroup } from "@patternfly/react-core/dist/esm/components/Form/index.js"; import { FormSelect, FormSelectOption } from "@patternfly/react-core/dist/esm/components/FormSelect/index.js"; import { Popover } from "@patternfly/react-core/dist/esm/components/Popover/index.js"; import { TextInput } from "@patternfly/react-core/dist/esm/components/TextInput/index.js"; import { ExternalLinkSquareAltIcon, HelpIcon } from '@patternfly/react-icons'; import { MacMenu, MemberInterfaceChoices, NetworkModal, Name, dialogSave } from './dialogs-common.jsx'; import { ModelContext } from './model-context.jsx'; import { useDialogs } from "dialogs.jsx"; import { v4 as uuidv4 } from 'uuid'; import { member_connection_for_interface, member_interface_choices, } from './interfaces.js'; const _ = cockpit.gettext; export const bond_mode_choices = [ { choice: 'balance-rr', title: _("Round robin") }, { choice: 'active-backup', title: _("Active backup") }, { choice: 'balance-xor', title: _("XOR") }, { choice: 'broadcast', title: _("Broadcast") }, { choice: '802.3ad', title: _("802.3ad") }, { choice: 'balance-tlb', title: _("Adaptive transmit load balancing") }, { choice: 'balance-alb', title: _("Adaptive load balancing") } ]; const bond_monitoring_choices = [ { choice: 'mii', title: _("MII (recommended)") }, { choice: 'arp', title: _("ARP") } ]; const modes_with_primary = [ 'active-backup', 'balance-tlb', 'balance-alb' ]; export const BondDialog = ({ connection, dev, settings }) => { const Dialogs = useDialogs(); const idPrefix = "network-bond-settings"; const model = useContext(ModelContext); const options = settings.bond.options; const memberChoicesInit = {}; member_interface_choices(model, connection).forEach((iface) => { memberChoicesInit[iface.Name] = !!member_connection_for_interface(connection, iface); }); const [dialogError, setDialogError] = useState(undefined); const [iface, setIface] = useState(settings.connection.interface_name); const [linkDownDelay, setLinkDownDelay] = useState(options.downdelay || "0"); const [linkMonitoring, setLinkMonitoring] = useState(options.arp_interval ? "arp" : "mii"); const [linkMonitoringInterval, setLinkMonitoringInterval] = useState(options.miimon || options.arp_interval || "100"); const [linkUpDelay, setLinkUpDelay] = useState(options.updelay || "0"); const [mac, setMAC] = useState((settings.ethernet && settings.ethernet.assigned_mac_address) || ""); const [memberChoices, setMemberChoices] = useState(memberChoicesInit); const [mode, setMode] = useState(options.mode); const [monitoringTargets, setMonitoringTargets] = useState(options.arp_ip_target); const [primary, setPrimary] = useState(options.primary); const onSubmit = (ev) => { const options = settings.bond.options; delete options.primary; const createSettingsObj = () => ({ ...settings, connection: { ...settings.connection, id: iface, interface_name: iface, }, ethernet: { assigned_mac_address: mac }, bond: { ...settings.bond, interface_name: iface, options: { ...options, mode, ...(linkMonitoring === 'mii' && { miimon: linkMonitoringInterval, updelay: linkUpDelay, downdelay: linkDownDelay, }), ...(linkMonitoring === 'arp' && { arp_interval: linkMonitoringInterval, arp_ip_target: monitoringTargets, }), ...(modes_with_primary.includes(mode) && primary && { primary }) } } }); dialogSave({ model, dev, connection, members: memberChoices, membersInit: memberChoicesInit, settings: createSettingsObj(), setDialogError, onClose: Dialogs.close, }); // Prevent dialog from closing because of