[Fusioninventory-devel] Confusion between network interfaces and network addresses

Guillaume Rousse guillomovitch at gmail.com
Thu Apr 5 07:42:32 UTC 2012


While reviewing yesterday changes from Goneri, I found there was some 
confusion in our code between two different concepts: network interfaces 
and network addresses. Worse, we are not even consistent among the 
various OS, most notably between Linux and Windows.

Let's consider a machine with two interfaces, one active with two 
attached addresses, and one inactive.

Strategy 1:
In Windows code, as seen in the t/inventory/windows/networks.t expected 
results, a 'networks' entry is strictly a network interface. The example 
scenario would result into the following internal representation:
{
   description => 'foo',
   ipaddress => [ '127.0.0.1', '127.0.0.2' ],
   ipmask    => [ '255.0.0.0', '255.0.0.0' ]
},
{
   description => 'bar',
   status => 'down'
}
Which translates into the following XML result with multiple elements of 
the same name:
<NETWORKS>
   <DESCRIPTION>foo</DESCRIPTION>
   <IPADDRESS>127.0.0.1</IPADDRESS>
   <IPADDRESS>127.0.0.2</IPADDRESS>
   <IPMASK>255.0.0.0</IPMASK>
   <IPMASK>255.0.0.0</IPMASK>
</NETWORKS>
<NETWORKS>
   <DESCRIPTION>bar</DESCRIPTION>
   <STATUS>down</STATUS>
</NETWORKS>
Advantage: consistent nature of 'networks' entries
Inconvients: less relationship between each address components (address, 
mask, subnet)

Strategy 2:
In Linux code, at least for /sbin/ip parsing, a networks entry is either 
a single network address, or a network interfaces (for interfaces 
without attached addresses), as can be seen from expected results from 
t/tools/linux.t. The example scenario would result into the following 
internal representation:
{
   description => 'foo',
   ipaddress => '127.0.0.1',
   ipmask    => '255.0.0.0',
},
{
   description => 'foo',
   ipaddress => '127.0.0.2',
   ipmask    => '255.0.0.0'
},
{
   description => 'bar',
   status => 'down'
}
and the following XML representation:
<NETWORKS>
   <DESCRIPTION>foo</DESCRIPTION>
   <IPADDRESS>127.0.0.1</IPADDRESS>
   <IPMASK>255.0.0.0</IPMASK>
</NETWORKS>
<NETWORKS>
   <DESCRIPTION>foo</DESCRIPTION>
   <IPADDRESS>127.0.0.2</IPADDRESS>
   <IPMASK>255.0.0.0</IPMASK>
</NETWORKS>
<NETWORKS>
   <DESCRIPTION>bar</DESCRIPTION>
   <STATUS>down</STATUS>
</NETWORKS>
We now have three objects instead of two for the same configuration...
Advantage: strict relationship between each address components (address, 
mask, subnet)
Inconvients: inconsistent nature of 'networks' entries

Alternative representations:

Strategy 3:
We could consider network addresses only, but we would loose interfaces 
without attached addresses:
{
   description => 'foo',
   ipaddress => '127.0.0.1',
   ipmask    => '255.0.0.0',
},
{
   description => 'foo',
   ipaddress => '127.0.0.2',
   ipmask    => '255.0.0.0'
}
<NETWORKS>
   <DESCRIPTION>foo</DESCRIPTION>
   <IPADDRESS>127.0.0.1</IPADDRESS>
   <IPMASK>255.0.0.0</IPMASK>
</NETWORKS>
<NETWORKS>
   <DESCRIPTION>foo</DESCRIPTION>
   <IPADDRESS>127.0.0.2</IPADDRESS>
   <IPMASK>255.0.0.0</IPMASK>
</NETWORKS>
Advantages:
- strict relationship between each address components (address, mask, 
subnet)
- consistent nature of 'networks' entries
Inconvients: loss of unactives interfaces

Strategy 4:
We could also keep the network-only representation with multivalued 
attributes of Windows code, but flattening the XML result:
<NETWORKS>
   <DESCRIPTION>foo</DESCRIPTION>
   <IPADDRESS>127.0.0.1,127.0.0.2</IPADDRESS>
   <IPMASK>255.0.0.0, 255.0.0.0</IPMASK>
</NETWORKS>
<NETWORKS>
   <DESCRIPTION>bar</DESCRIPTION>
   <STATUS>down</STATUS>
</NETWORKS>
Advantage: consistent nature of 'networks' entries
Inconvients:
- less relationship between each address components (address, mask, subnet)
- less structured result (parsing would have to be done server-side)

Strategy 5:
Last option, use a structured representation closer to the actual 
concepts relationship, but it would be hard to translate into an XML 
format without breaking OCS compatibility:
{
   description => 'foo',
   addresses => [
     {
       ipaddress => '127.0.0.1',
       ipmask    => '255.0.0.0',
     },
     {
       ipaddress => '127.0.0.2',
       ipmask    => '255.0.0.0'
     }
   ],
},
{
   description => 'bar',
   status => 'down'
}
<NETWORKS>
   <DESCRIPTION>foo</DESCRIPTION>
   <ADDRESS>
     <IPADDRESS>127.0.0.1</IPADDRESS>
     <IPMASK>255.0.0.0</IPMASK>
   </ADDRESS>
   <ADDRESS>
     <IPADDRESS>127.0.0.2</IPADDRESS>
     <IPMASK>255.0.0.0</IPMASK>
   </ADDRESS>
</NETWORKS>
<NETWORKS>
   <DESCRIPTION>bar</DESCRIPTION>
   <STATUS>down</STATUS>
</NETWORKS>

I think we all agree we should enforce a consistent strategy everywhere. 
My favorite ones would be 1, then 3, then 2. mainly because I prefer the 
idea of having all 'networks' entries corresponding to a single concept, 
rather than the idea of mixing concepts just for practical advantage.

-- 
BOFH excuse #334:

50% of the manual is in .pdf readme files



More information about the Fusioninventory-devel mailing list