package org.openslx.libvirt.domain.device;
import org.openslx.libvirt.xml.LibvirtXmlNode;
/**
* A network interface device node in a Libvirt domain XML document.
*
* @author Manuel Bentele
* @version 1.0
*/
public class Interface extends Device
{
/**
* Creates an empty network device.
*/
public Interface()
{
super();
}
/**
* Creates a network device representing an existing Libvirt XML network interface device
* element.
*
* @param xmlNode existing Libvirt XML network interface device element.
*/
public Interface( LibvirtXmlNode xmlNode )
{
super( xmlNode );
}
/**
* Returns hardware model of the network device.
*
* @return hardware model of the network device.
*/
public Model getModel()
{
String model = this.getXmlElementAttributeValue( "model", "type" );
return Model.fromString( model );
}
/**
* Sets hardware model for the network device.
*
* @param model hardware model for the network device.
*/
public void setModel( Model model )
{
this.setXmlElementAttributeValue( "model", "type", model.toString() );
}
/**
* Returns type of the network device.
*
* @return type of the network device.
*/
public Type getType()
{
return Type.fromString( this.getXmlElementAttributeValue( "type" ) );
}
/**
* Sets type of the network device.
*
* @param type network device type.
*/
public void setType( Type type )
{
String source = this.getSource();
// change type and set source again
this.setXmlElementAttributeValue( "type", type.toString() );
this.setSource( source );
}
/**
* Returns the source of the network device.
*
* @return source of the network device.
*/
public String getSource()
{
Type type = this.getType();
String source = null;
switch ( type ) {
case BRIDGE:
source = this.getXmlElementAttributeValue( "source", "bridge" );
break;
case NETWORK:
source = this.getXmlElementAttributeValue( "source", "network" );
break;
}
return source;
}
/**
* Sets the source for the network device.
*
* @param source for the network device.
*/
public void setSource( String source )
{
Type type = this.getType();
// remove all attributes from sub-element 'source'
this.removeXmlElementAttributes( "source" );
switch ( type ) {
case BRIDGE:
this.setXmlElementAttributeValue( "source", "bridge", source );
break;
case NETWORK:
this.setXmlElementAttributeValue( "source", "network", source );
break;
}
}
/**
* Returns MAC address of the network device.
*
* @return MAC address of the network device.
*/
public String getMacAddress()
{
return this.getXmlElementAttributeValue( "mac", "address" );
}
/**
* Sets MAC address of the network device.
*
* @param macAddress MAC address for the network device.
*/
public void setMacAddress( String macAddress )
{
this.setXmlElementAttributeValue( "mac", "address", macAddress );
}
/**
* Removes boot oder entry of the network interface device.
*/
public void removeBootOrder()
{
this.removeXmlElement( "boot" );
}
/**
* Removes network source of the network interface device.
*/
public void removeSource()
{
this.removeXmlElement( "source" );
}
/**
* Removes MAC address of the network interface device.
*/
public void removeMacAddress()
{
this.removeXmlElement( "mac" );
}
/**
* Creates a non-existent network interface device as Libvirt XML device element.
*
* @param iface network device that is created.
* @param xmlNode Libvirt XML node of the Libvirt XML device that is created.
* @return created network device instance.
*/
public static Interface createInstance( Interface iface, LibvirtXmlNode xmlNode )
{
Interface addedInterface = null;
if ( iface instanceof InterfaceBridge ) {
xmlNode.setXmlElementAttributeValue( "type", Type.BRIDGE.toString() );
addedInterface = InterfaceBridge.createInstance( xmlNode );
} else if ( iface instanceof InterfaceNetwork ) {
xmlNode.setXmlElementAttributeValue( "type", Type.NETWORK.toString() );
addedInterface = InterfaceNetwork.createInstance( xmlNode );
}
return addedInterface;
}
/**
* Creates a network interface device representing an existing Libvirt XML network interface
* device element.
*
* @param xmlNode existing Libvirt XML network interface device element.
* @return network interface device instance.
*/
public static Interface newInstance( LibvirtXmlNode xmlNode )
{
Interface deviceInterface = null;
Type type = Type.fromString( xmlNode.getXmlElementAttributeValue( "type" ) );
if ( type == null ) {
return null;
}
switch ( type ) {
case BRIDGE:
deviceInterface = InterfaceBridge.newInstance( xmlNode );
break;
case NETWORK:
deviceInterface = InterfaceNetwork.newInstance( xmlNode );
break;
}
return deviceInterface;
}
/**
* Type of network interface device.
*
* @author Manuel Bentele
* @version 1.0
*/
public enum Type
{
// @formatter:off
BRIDGE ( "bridge" ),
NETWORK( "network" );
// @formatter:on
/**
* Name of the network interface device type.
*/
private String type = null;
/**
* Creates network interface device type.
*
* @param type valid name of the network interface device type in a Libvirt domain XML
* document.
*/
Type( String type )
{
this.type = type;
}
@Override
public String toString()
{
return this.type;
}
/**
* Creates network interface device type from its name with error check.
*
* @param type name of the network interface device type in a Libvirt domain XML document.
* @return valid network interface device type.
*/
public static Type fromString( String type )
{
for ( Type t : Type.values() ) {
if ( t.type.equalsIgnoreCase( type ) ) {
return t;
}
}
return null;
}
}
/**
* Model of network interface device.
*
* @author Manuel Bentele
* @version 1.0
*/
public enum Model
{
// @formatter:off
E1000 ( "e1000" ),
E1000_82544GC ( "e1000-82544gc" ),
E1000_82545EM ( "e1000-82545em" ),
E1000E ( "e1000e" ),
I82550 ( "i82550" ),
I82551 ( "i82551" ),
I82557A ( "i82557a" ),
I82557B ( "i82557b" ),
I82557C ( "i82557c" ),
I82558A ( "i82558a" ),
I82558B ( "i82558b" ),
I82559A ( "i82559a" ),
I82559B ( "i82559b" ),
I82559C ( "i82559c" ),
I82559ER ( "i82559er" ),
I82562 ( "i82562" ),
I82801 ( "i82801" ),
NE2K_PCI ( "ne2k_pci" ),
PCNET ( "pcnet" ),
RTL8139 ( "rtl8139" ),
TULIP ( "tulip" ),
VIRTIO ( "virtio" ),
VIRTIO_NET_PCI ( "virtio-net-pci" ),
VIRTIO_NET_PCI_NON_TRANSITIONAL( "virtio-net-pci-non-transitional" ),
VIRTIO_NET_PCI_TRANSITIONAL ( "virtio-net-pci-transitional" ),
VMXNET3 ( "vmxnet3" );
// @formatter:on
/**
* Name of the network interface device model.
*/
private String model = null;
/**
* Creates network interface device model.
*
* @param type valid name of the network interface device model in a Libvirt domain XML
* document.
*/
Model( String model )
{
this.model = model;
}
@Override
public String toString()
{
return this.model;
}
/**
* Creates network interface device model from its name with error check.
*
* @param model name of the network interface device model in a Libvirt domain XML document.
* @return valid network interface device model.
*/
public static Model fromString( String model )
{
for ( Model m : Model.values() ) {
if ( m.model.equalsIgnoreCase( model ) ) {
return m;
}
}
return null;
}
}
}