Interfaces

Given an Node instance bound to your MAAS server, you can view and modify its interface configuration. This applies to all Machine, Device, RackController, and RegionController.

Read interfaces

All Node objects have an interfaces property that provide a sequence of all Interface‘s on the Node.

>>> machine.interfaces
<Interfaces.Managed#Machine length=1 items=[
  <Interface mac_address='52:54:00:b4:7e:8c' name='ens3'
    type=<InterfaceType.PHYSICAL: 'physical'>>]>
>>> machine.boot_interface
<Interface mac_address='52:54:00:b4:7e:8c' name='ens3'
  type=<InterfaceType.PHYSICAL: 'physical'>>

On bond, VLAN, and bridge interfaces you can get the parents that make the interface. You can also go the other direction and view the children interfaces that are using this interface.

Note: Parent and children objects are unloaded so they must be loaded to access the properties of the object.

>>> bond.parents
<Interfaces.Managed#Interface length=2 items=[
  <Interface name='ens3'
    node=<Node system_id='yr7fym' (unloaded)> (unloaded)>,
  <Interface name='ens4'
    node=<Node system_id='yr7fym' (unloaded)> (unloaded)>,
  ]>
>>> ens3 = bond.parents[0]
>>> ens3.loaded
False
>>> ens3.refresh()
>>> ens3.type
<InterfaceType.PHYSICAL: 'physical'>
>>> ens3.children
<Interfaces.Managed#Interface length=1 items=[
  <Interface name='bond0'
    node=<Node system_id='yr7fym' (unloaded)> (unloaded)>,
  ]>

Get interface by name

The interfaces property on Node gives you access to all interfaces on the node. Sometimes you want to access the interface objects by name. by_name and get_by_name are helpers on Interfaces that help.

>>> machine.interfaces.by_name
{'bond0': <Interface mac_address='52:54:00:b4:7e:8c'
    name='bond0' type=<InterfaceType.BOND: 'bond'>>,
 'ens3': <Interface mac_address='52:54:00:b4:7e:8c'
     name='ens3' type=<InterfaceType.PHYSICAL: 'physical'>>,
 'ens8': <Interface mac_address='52:54:00:11:f3:d2'
    name='ens8' type=<InterfaceType.PHYSICAL: 'physical'>>}
>>> bond = machine.interfaces.get_by_name('bond0')
>>> bond
<Interface mac_address='52:54:00:b4:7e:8c'
    name='bond0' type=<InterfaceType.BOND: 'bond'>>

Read IP configuration

Every Interface has a links property that provides all the IP information on how the interface is configured.

>>> bond.links
<InterfaceLinks.Managed#Interface length=1 items=[
  <InterfaceLink ip_address=None mode=<LinkMode.AUTO: 'auto'>
    subnet=<Subnet cidr='192.168.122.0/24' name='192.168.122.0/24'
      vlan=<Vlan name='untagged' vid=0>>>]>

Create physical

Creation of interfaces is done directly on the interfaces property of a Node. Physical interface is the default type for the create method so only mac_address is required.

>>> new_phy = machine.interfaces.create(mac_address="00:11:22:aa:bb:cc")
>>> new_phy
<Interface mac_address='00:11:22:aa:bb:cc' name='eth0'
  type=<InterfaceType.PHYSICAL: 'physical'>>

By default the interface is created disconnected. To create it the interface with it connected to a VLAN pass the vlan parameter.

>>> default_vlan = client.fabrics.get_default().vlans.get_default()
>>> new_phy = machine.interfaces.create(
...    mac_address="00:11:22:aa:bb:cc", vlan=default_vlan)
>>> new_phy
<Interface mac_address='00:11:22:aa:bb:cc' name='eth0'
  type=<InterfaceType.PHYSICAL: 'physical'>>
>>> new_phy.vlan
<Vlan name='untagged' vid=0>

Create bond

Bond creation is the same as creating a physical interface but an InterfaceType is provided with options specific for a bond.

>>> new_bond = machine.interfaces.create(
...    InterfaceType.BOND, name='bond0', parents=machine.interfaces,
...    bond_mode='802.3ad')
>>> new_bond
<Interface mac_address='52:54:00:b4:7e:8c' name='bond0'
  type=<InterfaceType.BOND: 'bond'>>
>>> new_bond.params
{'bond_downdelay': 0,
 'bond_lacp_rate': 'slow',
 'bond_miimon': 100,
 'bond_mode': '802.3ad',
 'bond_updelay': 0,
 'bond_xmit_hash_policy': 'layer2'}

Create vlan

VLAN creation only requires a single parent and a tagged VLAN to connect the interface to.

>>> default_fabric = client.fabrics.get_default()
>>> vlan_10 = default_fabric.vlans.create(10)
>>> vlan_nic = machine.interfaces.create(
...     InterfaceType.VLAN, parent=new_bond, vlan=vlan_10)
>>> vlan_nic
<Interface mac_address='52:54:00:b4:7e:8c' name='bond0.10'
  type=<InterfaceType.VLAN: 'vlan'>>

Create bridge

Bridge creation only requires the name and parent interface you want the bridge to be created on.

>>> bridge_nic = machine.interfaces.create(
...     InterfaceType.BRIDGE, name='br0', parent=vlan_nic)
>>> bridge_nic
<Interface mac_address='52:54:00:b4:7e:8c' name='br0'
  type=<InterfaceType.BRIDGE: 'bridge'>>

Update interface

To update an interface just changing the properties of the interface and calling save is all that is required.

>>> new_bond.name = 'my-bond'
>>> new_bond.params['bond_mode'] = 'active-backup'
>>> new_bond.save()

Change IP configuration

To adjust the IP configuration on a specific interface create on the links property and delete on the InterfaceLink can be used.

>>> new_bond.links.create(LinkMode.AUTO, subnet=subnet)
<InterfaceLink ip_address=None mode=<LinkMode.AUTO: 'auto'>
  subnet=<Subnet cidr='192.168.122.0/24' name='192.168.122.0/24'
    vlan=<Vlan name='untagged' vid=0>>>
>>> new_bond.links[-1].delete()
>>> new_bond.links.create(
...     LinkMode.STATIC, subnet=subnet, ip_address='192.168.122.1')
<InterfaceLink ip_address='192.168.122.10' mode=<LinkMode.STATIC: 'static'>
  subnet=<Subnet cidr='192.168.122.0/24' name='192.168.122.0/24'
    vlan=<Vlan name='untagged' vid=0>>>
>>> new_bond.links[-1].delete()

Disconnect interface

To completely mark an interface as disconnected and remove all configuration the disconnect call makes this easy.

>>> new_bond.disconnect()

Delete interface

delete exists directly on the Interface object so deletion is simple.

>>> new_bond.delete()