Class: Y2Network::Widgets::BondPort
- Inherits:
-
CWM::CustomWidget
- Object
- CWM::CustomWidget
- Y2Network::Widgets::BondPort
- Includes:
- UI::TextHelpers, PortItems
- Defined in:
- src/lib/y2network/widgets/bond_port.rb
Instance Method Summary collapse
- #contents ⇒ Object
-
#continue_with_duplicates?(physical_ports) ⇒ Boolean
Given a map of duplicated port ids with device names, aks the user if he would like to continue or not.
- #enable_position_buttons ⇒ Object
- #handle(event) ⇒ Object
- #help ⇒ Object
-
#init ⇒ Object
Default function to init the value of port devices box for bonding.
-
#initialize(settings) ⇒ BondPort
constructor
A new instance of BondPort.
-
#justify_dev_name(name) ⇒ String
A helper for sort devices by name.
-
#repeated_physical_port_ids(b_ports) ⇒ Hash{String => Array<String>}
Given a list of device names returns a hash of physical port ids mapping device names if at least two devices shared the same physical port id TODO: backend method.
- #selected_items ⇒ Object
-
#store ⇒ Object
Default function to store the value of port devices box.
- #ui_items ⇒ Object
-
#validate ⇒ Object
Validates created bonding.
- #value ⇒ Object
- #value_index ⇒ Object
Methods included from PortItems
#physical_port_id, #physical_port_id?, #port_items_from
Constructor Details
#initialize(settings) ⇒ BondPort
Returns a new instance of BondPort.
36 37 38 39 |
# File 'src/lib/y2network/widgets/bond_port.rb', line 36 def initialize(settings) textdomain "network" @settings = settings end |
Instance Method Details
#contents ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'src/lib/y2network/widgets/bond_port.rb', line 41 def contents Frame( _("Bond Ports and Order"), VBox( MultiSelectionBox(Id(:bond_ports_items), Opt(:notify), "", []), HBox( # TRANSLATORS: this means "move this line upwards" PushButton(Id(:bond_ports_up), Opt(:disabled), _("Up")), # TRANSLATORS: this means "move this line downwards" PushButton(Id(:bond_ports_down), Opt(:disabled), _("Down")) ) ) ) end |
#continue_with_duplicates?(physical_ports) ⇒ Boolean
Given a map of duplicated port ids with device names, aks the user if he would like to continue or not.
mapping to an array of device names
232 233 234 235 236 237 238 239 240 241 242 243 244 |
# File 'src/lib/y2network/widgets/bond_port.rb', line 232 def continue_with_duplicates?(physical_ports) = physical_ports.map do |p_port, b_ports| wrap_text("PhysicalPortID (#{p_port}): #{b_ports.join(", ")}") end.join("\n") Yast::Popup.YesNoHeadline( Yast::Label.WarningMsg, # Translators: Warn the user about not desired effect _("The interfaces selected share the same physical port and bonding " \ "them \nmay not have the desired effect of redundancy.\n\n%s\n\n" \ "Really continue?\n") % ) end |
#enable_position_buttons ⇒ Object
164 165 166 167 168 169 170 171 172 |
# File 'src/lib/y2network/widgets/bond_port.rb', line 164 def if value_index Yast::UI.ChangeWidget(:bond_ports_up, :Enabled, value_index > 0) Yast::UI.ChangeWidget(:bond_ports_down, :Enabled, value_index < ui_items.size - 1) else Yast::UI.ChangeWidget(:bond_ports_up, :Enabled, false) Yast::UI.ChangeWidget(:bond_ports_down, :Enabled, false) end end |
#handle(event) ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'src/lib/y2network/widgets/bond_port.rb', line 56 def handle(event) if event["EventReason"] == "SelectionChanged" elsif event["EventReason"] == "Activated" && event["WidgetClass"] == :PushButton items = ui_items || [] current = value.to_s index = value_index case event["ID"] when :bond_ports_up items[index], items[index - 1] = items[index - 1], items[index] when :bond_ports_down items[index], items[index + 1] = items[index + 1], items[index] else log.warn("unknown action #{event["ID"]}") return nil end Yast::UI.ChangeWidget(:bond_ports_items, :Items, items) Yast::UI.ChangeWidget(:bond_ports_items, :CurrentItem, current) else log.debug("event:#{event}") end nil end |
#help ⇒ Object
82 83 84 85 86 87 88 89 |
# File 'src/lib/y2network/widgets/bond_port.rb', line 82 def help # TODO: write it _( "<p>Select a devices for including into the bond.\n" \ "Only devices with the device activation set to <b>Never</b> " \ "and with <b>No Address Setup</b> are available.</p>" ) end |
#init ⇒ Object
Default function to init the value of port devices box for bonding.
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'src/lib/y2network/widgets/bond_port.rb', line 92 def init ports = @settings.ports # TODO: use def items, but problem now is that port_items returns term and not array items = port_items_from( @settings.bondable_interfaces.map(&:name), ports, Yast::Lan.yast_config # ideally get it from builder? ) # reorder the items l1, l2 = items.partition { |t| ports.include? t[0][0] } items = l1 + l2.sort_by { |t| justify_dev_name(t[0][0]) } Yast::UI.ChangeWidget(:bond_ports_items, :Items, items) Yast::UI.ChangeWidget( :bond_ports_items, :SelectedItems, ports ) nil end |
#justify_dev_name(name) ⇒ String
A helper for sort devices by name. It justify at right with 0's numeric parts of given device name until 5 digits.
TODO: should not be in CWM ==== Examples
justify_dev_name("eth0") # => "eth00000" justify_dev_name("eth111") # => "eth00111" justify_dev_name("enp0s25") # => "enp00000s00025"
186 187 188 189 190 191 192 193 194 195 |
# File 'src/lib/y2network/widgets/bond_port.rb', line 186 def justify_dev_name(name) splited_dev_name = name.scan(/\p{Alpha}+|\p{Digit}+/) splited_dev_name.map! do |d| if d =~ /\p{Digit}+/ d.rjust(5, "0") else d end end.join end |
#repeated_physical_port_ids(b_ports) ⇒ Hash{String => Array<String>}
Given a list of device names returns a hash of physical port ids mapping device names if at least two devices shared the same physical port id TODO: backend method
NOTE: term port is slightly overloaded here. Name of method refers to physical ports of a NIC card (one card can have multiple "plugs" - ports). On the other hand param name refers to pure virtual bonding ports (network devices provided by the system which are virtualy tighted together into a virtual bond device)
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 |
# File 'src/lib/y2network/widgets/bond_port.rb', line 210 def repeated_physical_port_ids(b_ports) physical_port_ids = {} b_ports.each do |b_port| next unless physical_port_id?(b_port) p_port = physical_port_id(b_port) ps = physical_port_ids[p_port] ||= [] ps << b_port end physical_port_ids.select! { |_k, v| v.size > 1 } physical_port_ids end |
#selected_items ⇒ Object
152 153 154 |
# File 'src/lib/y2network/widgets/bond_port.rb', line 152 def selected_items Yast::UI.QueryWidget(:bond_ports_items, :SelectedItems) || [] end |
#store ⇒ Object
Default function to store the value of port devices box.
120 121 122 |
# File 'src/lib/y2network/widgets/bond_port.rb', line 120 def store @settings.ports = selected_items end |
#ui_items ⇒ Object
156 157 158 |
# File 'src/lib/y2network/widgets/bond_port.rb', line 156 def ui_items Yast::UI.QueryWidget(:bond_ports_items, :Items) || [] end |
#validate ⇒ Object
Validates created bonding. Currently just prevent the user to create a bond with more than one interface sharing the same physical port id
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'src/lib/y2network/widgets/bond_port.rb', line 128 def validate physical_ports = repeated_physical_port_ids(selected_items) if !physical_ports.empty? return false unless continue_with_duplicates?(physical_ports) end if @settings.require_adaptation?(selected_items || []) return Yast::Popup.ContinueCancel( _( "At least one selected device is already configured.\n" \ "Adapt the configuration for bonding?\n" ) ) else true end end |
#value ⇒ Object
147 148 149 150 |
# File 'src/lib/y2network/widgets/bond_port.rb', line 147 def value # TODO: it is multiselection, so does it make sense? Yast::UI.QueryWidget(:bond_ports_items, :CurrentItem) end |
#value_index ⇒ Object
160 161 162 |
# File 'src/lib/y2network/widgets/bond_port.rb', line 160 def value_index ui_items.index { |i| i[0] == Id(value) } end |