Usage¶
All example scripts are written using LMIShell.
We also assume that lmishell
is connected to the CIMOM and the
connection is stored in connection
variable and variable ns
points to
cimv2 namespace:
connection = connect("server", "username", "password")
ns = connection.root.cimv2
Enumeration of network devices¶
Obtaining a list of network devices can be done by executing following
commands in lmishell
:
for device in ns.LMI_IPNetworkConnection.instances():
print device.ElementName
Get parameters of network devices¶
Obtaining parameters of network device might be a little bit tricky. DMTF standards split network device to three classes and one might need to traverse between them through associations, see Networking API concepts.
Following example prints name, its status, MAC address, link technology and maximal speed for each device.
MAC address is not in the LMI_IPNetworkConnection class and must be accessed through LMI_EndpointForIPNetworkConnection association to LMI_LANEndpoint class, same for MaxSpeed and LinkTechnology, those are in CIM_NetworkPort subclasses, associated through LMI_NetworkDeviceSAPImplementation class:
for device in ns.LMI_IPNetworkConnection.instances():
# print device name
print device.ElementName,
# print operating status
print ns.LMI_IPNetworkConnection.OperatingStatusValues.value_name(device.OperatingStatus),
# MAC address in not part of LMI_IPNetworkConnection but LMI_LANEndpoint class,
# which is associated through LMI_EndpointForIPNetworkConnection
lanendpoint = device.first_associator(AssocClass="LMI_EndpointForIPNetworkConnection")
# print MAC address
print lanendpoint.MACAddress,
# LinkTechnology is part of CIM_NetworkPort subclasses, we need to traverse
# through LMI_NetworkDeviceSAPImplementation association
networkport = lanendpoint.first_associator(AssocClass="LMI_NetworkDeviceSAPImplementation")
# print link technology
print ns.CIM_NetworkPort.LinkTechnologyValues.value_name(networkport.LinkTechnology),
# network speed might not be defined
if networkport.MaxSpeed:
# Convert bps to Mbps
print "%dMbps" % (networkport.MaxSpeed // (1024*1024)),
else:
print "unknown",
print
Get current IP configuration¶
Current IP addresses are in the LMI_IPProtocolEndpoint class associated to given LMI_IPNetworkConnection:
device = ns.LMI_IPNetworkConnection.first_instance({'ElementName': 'eth0'})
for endpoint in device.associators(AssocClass="LMI_NetworkSAPSAPDependency", ResultClass="LMI_IPProtocolEndpoint"):
if endpoint.ProtocolIFType == ns.LMI_IPProtocolEndpoint.ProtocolIFTypeValues.IPv4:
print "IPv4: %s/%s" % (endpoint.IPv4Address, endpoint.SubnetMask)
elif endpoint.ProtocolIFType == ns.LMI_IPProtocolEndpoint.ProtocolIFTypeValues.IPv6:
print "IPv6: %s/%d" % (endpoint.IPv6Address, endpoint.IPv6SubnetPrefixLength)
Default gateway is represented by instance of
LMI_NetworkRemoteServiceAccessPoint
with AccessContext
equal to DefaultGateway
:
for rsap in device.associators(AssocClass="LMI_NetworkRemoteAccessAvailableToElement", ResultClass="LMI_NetworkRemoteServiceAccessPoint"):
if rsap.AccessContext == ns.LMI_NetworkRemoteServiceAccessPoint.AccessContextValues.DefaultGateway:
print "Default Gateway: %s" % rsap.AccessInfo
For the list of DNS servers we need to traverse the object model a little bit.
First get LMI_IPProtocolEndpoint instances
associated with given LMI_IPNetworkConnection
via LMI_NetworkSAPSAPDependency.
Then use the same association to get instances of
LMI_DNSProtocolEndpoint.
Finally instances of
LMI_NetworkRemoteServiceAccessPoint
with AccessContext
equal to DNS Server
associated through
LMI_NetworkRemoteAccessAvailableToElement
have the DNS server address in the AccessInfo
property.
Note that there might be more possible path to get to the
RemoteServiceAccessPath and you might get duplicated entries. The set
is
used here to deduplicate the list of DNS servers:
dnsservers = set()
for ipendpoint in device.associators(AssocClass="LMI_NetworkSAPSAPDependency", ResultClass="LMI_IPProtocolEndpoint"):
for dnsedpoint in ipendpoint.associators(AssocClass="LMI_NetworkSAPSAPDependency", ResultClass="LMI_DNSProtocolEndpoint"):
for rsap in dnsedpoint.associators(AssocClass="LMI_NetworkRemoteAccessAvailableToElement", ResultClass="LMI_NetworkRemoteServiceAccessPoint"):
if rsap.AccessContext == ns.LMI_NetworkRemoteServiceAccessPoint.AccessContextValues.DNSServer:
dnsservers.add(rsap.AccessInfo)
print "DNS:", ", ".join(dnsservers)
Bring up / take down a network device¶
Note
Changing the state of a network device is not recommended! Just disconnect the active setting.
Use method RequestStateChange of the
LMI_LANEndpoint object. RequestedState
parameter
can be either Enabled
or Disabled
:
lanendpoint = ns.LMI_LANEndpoint.first_instance({ "ElementName": "eth0" })
lanendpoint.RequestStateChange(RequestedState=ns.LMI_LANEndpoint.RequestedStateValues.Enabled)
Enumerate available settings¶
One setting is a set of configuration options that are applicable to a network
interface. This setting is represented by a
LMI_IPAssignmentSettingData instances that
have AddressOrigin
equal to Cumulative Configuration
:
for settingdata in ns.LMI_IPAssignmentSettingData.instances():
if settingdata.AddressOrigin == ns.LMI_IPAssignmentSettingData.AddressOriginValues.cumulativeconfiguration:
print "Setting: %s" % settingdata.Caption
Obtaining setting details¶
Setting configuration is spread between the instances of LMI_IPAssignmentSettingData subclasses associated with the “master” setting:
settingdata = ns.LMI_IPAssignmentSettingData.first_instance({ "Caption": "eth0" })
for setting in settingdata.associators(AssocClass="LMI_OrderedIPAssignmentComponent"):
if setting.classname == "LMI_DHCPSettingData":
if setting.ProtocolIFType == ns.LMI_IPAssignmentSettingData.ProtocolIFTypeValues.IPv4:
print "IPv4 DHCP"
else:
print "IPv6 DHCPv6"
elif setting.classname == "LMI_ExtendedStaticIPAssignmentSettingData":
for i in range(len(setting["IPAddresses"])):
if setting["ProtocolIFType"] == ns.LMI_IPAssignmentSettingData.ProtocolIFTypeValues.IPv4:
print "Static IPv4 address: %s/%s, Gateway %s" % (
setting["IPAddresses"][i],
setting["SubnetMasks"][i],
setting["GatewayAddresses"][i])
else:
print "Static IPv6 address: %s/%d, Gateway %s" % (
setting["IPAddresses"][i],
setting["IPv6SubnetPrefixLengths"][i],
setting["GatewayAddresses"][i])
elif (setting.classname == "LMI_IPAssignmentSettingData" and
setting["AddressOrigin"] == ns.LMI_IPAssignmentSettingData.AddressOriginValues.Stateless):
print "IPv6 Stateless"
Create new setting¶
New setting is created by calling
LMI_CreateIPSetting
method on the instance of
LMI_IPNetworkConnectionCapabilities,
which is associated with LMI_IPNetworkConnection
through
LMI_IPNetworkConnectionElementCapabilities.
It also has the ElementName
property same as is the name of the network
interface.
Created setting can be modified by using ModifyInstance
intrinsic method
(push()
in the lmishell).
Let’s say we want to create a new setting with static IPv4 and stateless IPv6 configuration for given network interface:
capability = ns.LMI_IPNetworkConnectionCapabilities.first_instance({ 'ElementName': 'eth0' })
result = capability.LMI_CreateIPSetting(Caption='eth0 Static',
IPv4Type=capability.LMI_CreateIPSetting.IPv4TypeValues.Static,
IPv6Type=capability.LMI_CreateIPSetting.IPv6TypeValues.Stateless)
setting = result.rparams["SettingData"].to_instance()
for settingData in setting.associators(AssocClass="LMI_OrderedIPAssignmentComponent"):
if setting.ProtocolIFType == ns.LMI_IPAssignmentSettingData.ProtocolIFTypeValues.IPv4:
# Set static IPv4 address
settingData.IPAddresses = ["192.168.1.100"]
settingData.SubnetMasks = ["255.255.0.0"]
settingData.GatewayAddresses = ["192.168.1.1"]
settingData.push()
Set DNS servers for given setting¶
DNS server for given setting is stored in the DNSServerAddresses property of class LMI_DNSSettingData.
Following code adds IPv4 DNS server to the existing setting:
setting = ns.LMI_IPAssignmentSettingData.first_instance({ "Caption": "eth0 Static" })
for settingData in setting.associators(AssocClass="LMI_OrderedIPAssignmentComponent"):
if (settingData.classname == "LMI_DNSSettingData" and
settingData.ProtocolIFType == ns.LMI_IPAssignmentSettingData.ProtocolIFTypeValues.IPv4):
settingData.DNSServerAddresses.append("192.168.1.1")
settingData.push()
Manage static routes for given setting¶
Static route can be added by calling LMI_AddStaticIPRoute method on the instance of the LMI_IPAssignmentSettingData class:
setting = ns.LMI_IPAssignmentSettingData.first_instance({ "Caption": "eth0 Static" })
result = setting.LMI_AddStaticIPRoute(
AddressType=setting.LMI_AddStaticIPRouteValues.IPv4,
DestinationAddress="192.168.2.1",
DestinationMask="255.255.255.0")
route = result.rparams["Route"]
Additional parameters can be set by modifying the instance of
LMI_IPRouteSettingData. The route can be deleted
by using DeleteInstance
intrinsic method (delete()
in lmishell).
Delete setting¶
For setting deletion just call DeleteInstance intrinsic method (delete()
in the lmishell) to the instance of
LMI_IPAssignmentSettingData:
setting = ns.LMI_IPAssignmentSettingData.first_instance({ 'Caption': 'eth0 Static' })
setting.delete()
Apply setting¶
The setting can by applied to the network interface by calling ApplySettingToIPNetworkConnection of the LMI_IPConfigurationService class.
This method is asynchronous and returns a job, but lmishell can call it synchronously:
setting = ns.LMI_IPAssignmentSettingData.first_instance({ "Caption": "eth0 Static" })
port = ns.LMI_IPNetworkConnection.first_instance({ 'ElementName': 'ens8' })
service = ns.LMI_IPConfigurationService.first_instance()
service.SyncApplySettingToIPNetworkConnection(SettingData=setting, IPNetworkConnection=port, Mode=32768)
Mode
parameter affects how is the setting applied. Most commonly used
values are:
- Mode 1 – apply the setting now and make it auto-activated
- Mode 2 – just make it auto-activated, don’t apply now
- Mode 4 – disconnect and disable auto-activation
- Mode 5 – don’t change the setting state, only disable auto-activation
- Mode 32768 – apply the setting
- Mode 32769 – disconnect
Bridging and bonding¶
Warning
Bridge, bond and vlan support needs to be explicitly enabled when using 0.8 version of NetworkManager as a backend (for example on RHEL-6). Add following line to the /etc/sysconfig/network file and restart NetworkManager
NM_BOND_BRIDGE_VLAN_ENABLED=yes
Setting up¶
Use following code to create and activate bond with eth0 and eth1 interfaces:
# Get the interfaces
interface1 = ns.LMI_IPNetworkConnection.first_instance({ 'ElementName': 'eth0' })
interface2 = ns.LMI_IPNetworkConnection.first_instance({ 'ElementName': 'eth1' })
# Get the capabilities
capability1 = interface1.first_associator(AssocClass="LMI_IPNetworkConnectionElementCapabilities",
ResultClass="LMI_IPNetworkConnectionCapabilities")
capability2 = interface2.first_associator(AssocClass="LMI_IPNetworkConnectionElementCapabilities",
ResultClass="LMI_IPNetworkConnectionCapabilities")
# Use one of the capabilities to create the bond
result = capability1.LMI_CreateIPSetting(Caption='Bond',
Type=capability1.LMI_CreateIPSetting.TypeValues.Bonding,
IPv4Type=capability1.LMI_CreateIPSetting.IPv4TypeValues.DHCP)
setting = result.rparams["SettingData"].to_instance()
# Get first slave setting
slave1setting = setting.first_associator_name(ResultClass="LMI_BondingSlaveSettingData",
AssocClass="LMI_OrderedIPAssignmentComponent")
# Enslave the second interface using the second capability
result = capability2.LMI_CreateSlaveSetting(MasterSettingData=setting)
# Get second slave setting
slave2setting = result.rparams["SettingData"]
service = ns.LMI_IPConfigurationService.first_instance()
# Activate the bond
service.SyncApplySettingToIPNetworkConnection(
SettingData=slave1setting,
IPNetworkConnection=interface1,
Mode=32768)
service.SyncApplySettingToIPNetworkConnection(
SettingData=slave2setting,
IPNetworkConnection=interface2,
Mode=32768)
Displaying current state¶
Following code displays existing bonds and bonded interfaces:
for linkaggregation in ns.LMI_LinkAggregator8023ad.instances():
print "Bond: %s" % linkaggregation.Name
for lagport in linkaggregation.associators(AssocClass="LMI_LinkAggregationBindsTo",
ResultClass="LMI_LAGPort8023ad"):
print "Bonded interface: %s" % lagport.Name
Following code displays existing bridges and bridged interfaces:
for switchservice in ns.LMI_SwitchService.instances():
print "Bridge: %s" % switchservice.Name
for switchport in switchservice.associators(AssocClass="LMI_SwitchesAmong",
ResultClass="LMI_SwitchPort"):
print "Bridged interface: %s" % switchport.Name