Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
slapos.core
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Lu Xu
slapos.core
Commits
e82a51c4
Commit
e82a51c4
authored
Feb 01, 2012
by
Cédric de Saint Martin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor to use 'interface' name where 'bridge' was used
parent
1c1f266e
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
63 additions
and
62 deletions
+63
-62
slapos.cfg.example
slapos.cfg.example
+1
-1
slapos/format.py
slapos/format.py
+62
-61
No files found.
slapos.cfg.example
View file @
e82a51c4
...
...
@@ -9,7 +9,7 @@ buildout = /path/to/buildout/binary
computer_xml = /opt/slapos/slapos.xml
log_file = /opt/slapos/slapformat.log
partition_amount = 200
bridg
e_name = br0
interfac
e_name = br0
partition_base_name = slappart
user_base_name = slapuser
tap_base_name = slaptap
...
...
slapos/format.py
View file @
e82a51c4
...
...
@@ -73,24 +73,24 @@ class OS(object):
class
UsageError
(
Exception
):
pass
class
NoAddressOn
Bridg
e
(
Exception
):
class
NoAddressOn
Interfac
e
(
Exception
):
"""
Exception raised if there's not address on the
bridg
e to construct IPv6
Exception raised if there's not address on the
interfac
e to construct IPv6
address with.
Attributes:
brige: String, the name of the
bridg
e.
brige: String, the name of the
interfac
e.
"""
def
__init__
(
self
,
bridg
e
):
super
(
NoAddressOn
Bridg
e
,
self
).
__init__
(
'No IPv6 found on
bridge %s to construct IPv6 with.'
%
(
bridg
e
,
)
def
__init__
(
self
,
interfac
e
):
super
(
NoAddressOn
Interfac
e
,
self
).
__init__
(
'No IPv6 found on
interface %s to construct IPv6 with.'
%
(
interfac
e
,
)
)
class
AddressGenerationError
(
Exception
):
"""
Exception raised if the generation of an IPv6 based on the prefix obtained
from the
bridg
e failed.
from the
interfac
e failed.
Attributes:
addr: String, the invalid address the exception is raised for.
...
...
@@ -161,15 +161,15 @@ class Computer(object):
instance_root
=
None
software_root
=
None
def
__init__
(
self
,
reference
,
bridg
e
=
None
,
addr
=
None
,
netmask
=
None
,
def
__init__
(
self
,
reference
,
interfac
e
=
None
,
addr
=
None
,
netmask
=
None
,
ipv6_interface
=
None
,
software_user
=
'slapsoft'
):
"""
Attributes:
reference: String, the reference of the computer.
bridge: String, if it has one, the name of the computer's bridg
e.
interface: String, the name of the computer's used interfac
e.
"""
self
.
reference
=
str
(
reference
)
self
.
bridge
=
bridg
e
self
.
interface
=
interfac
e
self
.
partition_list
=
[]
self
.
address
=
addr
self
.
netmask
=
netmask
...
...
@@ -177,17 +177,17 @@ class Computer(object):
self
.
software_user
=
software_user
def
__getinitargs__
(
self
):
return
(
self
.
reference
,
self
.
bridg
e
)
return
(
self
.
reference
,
self
.
interfac
e
)
def
getAddress
(
self
):
"""
Return a list of the
bridg
e address not attributed to any partition, (which
Return a list of the
interfac
e address not attributed to any partition, (which
are therefore free for the computer itself).
Returns:
False if the
bridg
e isn't available, else the list of the free addresses.
False if the
interfac
e isn't available, else the list of the free addresses.
"""
if
self
.
bridg
e
is
None
:
if
self
.
interfac
e
is
None
:
return
dict
(
addr
=
self
.
address
,
netmask
=
self
.
netmask
)
computer_partition_address_list
=
[]
...
...
@@ -195,8 +195,8 @@ class Computer(object):
for
address
in
partition
.
address_list
:
if
netaddr
.
valid_ipv6
(
address
[
'addr'
]):
computer_partition_address_list
.
append
(
address
[
'addr'
])
# Going through addresses of the computer's
bridg
e interface
for
address_dict
in
self
.
bridg
e
.
getGlobalScopeAddressList
():
# Going through addresses of the computer's
interfac
e interface
for
address_dict
in
self
.
interfac
e
.
getGlobalScopeAddressList
():
# Comparing with computer's partition addresses
if
address_dict
[
'addr'
]
not
in
computer_partition_address_list
:
return
address_dict
...
...
@@ -204,8 +204,8 @@ class Computer(object):
# all addresses on interface are for partition, so lets add new one
computer_tap
=
Tap
(
'compdummy'
)
computer_tap
.
createWithOwner
(
User
(
'root'
),
attach_to_tap
=
True
)
self
.
bridg
e
.
addTap
(
computer_tap
)
return
self
.
bridg
e
.
addAddr
()
self
.
interfac
e
.
addTap
(
computer_tap
)
return
self
.
interfac
e
.
addAddr
()
def
send
(
self
,
config
):
"""
...
...
@@ -296,7 +296,7 @@ class Computer(object):
Construct the computer object as it is.
"""
if
alter_network
and
self
.
address
is
not
None
:
self
.
bridg
e
.
addAddr
(
self
.
address
,
self
.
netmask
)
self
.
interfac
e
.
addAddr
(
self
.
address
,
self
.
netmask
)
for
path
in
self
.
instance_root
,
self
.
software_root
:
if
not
os
.
path
.
exists
(
path
):
...
...
@@ -330,13 +330,13 @@ class Computer(object):
if
alter_network
:
# In case it has to be attached to the TAP network device, only one
# is necessary for the
bridg
e to assert carrier
if
self
.
bridg
e
.
attach_to_tap
and
partition_index
==
0
:
# is necessary for the
interfac
e to assert carrier
if
self
.
interfac
e
.
attach_to_tap
and
partition_index
==
0
:
partition
.
tap
.
createWithOwner
(
owner
,
attach_to_tap
=
True
)
else
:
partition
.
tap
.
createWithOwner
(
owner
)
self
.
bridg
e
.
addTap
(
partition
.
tap
)
self
.
interfac
e
.
addTap
(
partition
.
tap
)
# Reconstructing partition's directory
partition
.
createPath
(
alter_user
)
...
...
@@ -347,8 +347,8 @@ class Computer(object):
# * local IPv4, took from slapformat:ipv4_local_network
if
len
(
partition
.
address_list
)
==
0
:
# regenerate
partition
.
address_list
.
append
(
self
.
bridg
e
.
addIPv4LocalAddress
())
partition
.
address_list
.
append
(
self
.
bridg
e
.
addAddr
())
partition
.
address_list
.
append
(
self
.
interfac
e
.
addIPv4LocalAddress
())
partition
.
address_list
.
append
(
self
.
interfac
e
.
addAddr
())
elif
alter_network
:
# regenerate list of addresses
old_partition_address_list
=
partition
.
address_list
...
...
@@ -363,16 +363,16 @@ class Computer(object):
raise
ValueError
(
'Not valid ipv6 addresses loaded'
)
for
address
in
old_partition_address_list
:
if
netaddr
.
valid_ipv6
(
address
[
'addr'
]):
partition
.
address_list
.
append
(
self
.
bridg
e
.
addAddr
(
partition
.
address_list
.
append
(
self
.
interfac
e
.
addAddr
(
address
[
'addr'
],
address
[
'netmask'
]))
elif
netaddr
.
valid_ipv4
(
address
[
'addr'
]):
partition
.
address_list
.
append
(
self
.
bridg
e
.
addIPv4LocalAddress
(
partition
.
address_list
.
append
(
self
.
interfac
e
.
addIPv4LocalAddress
(
address
[
'addr'
]))
else
:
raise
ValueError
(
'Address %r is incorrect'
%
address
[
'addr'
])
finally
:
if
alter_network
and
self
.
bridg
e
.
attach_to_tap
:
if
alter_network
and
self
.
interfac
e
.
attach_to_tap
:
try
:
self
.
partition_list
[
0
].
tap
.
detach
()
except
IndexError
:
...
...
@@ -513,6 +513,7 @@ class Tap(object):
there is carrier, e.g. the network cable is plugged into a switch for
example).
In case of bridge:
In order to be able to check the uniqueness of IPv6 address assigned to
the bridge, the network interface must be up from an administrative *and*
operational point of view.
...
...
@@ -574,20 +575,20 @@ class Tap(object):
if
attach_to_tap
:
threading
.
Thread
(
target
=
self
.
attach
).
start
()
class
Bridg
e
(
object
):
"
Bridge represent a bridg
e on the system"
class
Interfac
e
(
object
):
"
Interface represent a interfac
e on the system"
def
__init__
(
self
,
name
,
ipv4_local_network
,
ipv6_interface
=
None
):
"""
Attributes:
name: String, the name of the
bridg
e
name: String, the name of the
interfac
e
"""
self
.
name
=
str
(
name
)
self
.
ipv4_local_network
=
ipv4_local_network
self
.
ipv6_interface
=
ipv6_interface
# Attach to TAP network interface, only if the
bridg
e interface does not
# Attach to TAP network interface, only if the
interfac
e interface does not
# report carrier
_
,
result
=
callAndRead
([
'ip'
,
'addr'
,
'list'
,
self
.
name
])
self
.
attach_to_tap
=
'DOWN'
in
result
.
split
(
'
\
n
'
,
1
)[
0
]
...
...
@@ -630,19 +631,19 @@ class Bridge(object):
return
address_list
def
getInterfaceList
(
self
):
"""Returns list of interfaces already present on
bridg
e"""
"""Returns list of interfaces already present on
interfac
e"""
interface_list
=
[]
_
,
result
=
callAndRead
([
'brctl'
,
'show'
])
in_
bridg
e
=
False
in_
interfac
e
=
False
for
line
in
result
.
split
(
'
\
n
'
):
if
len
(
line
.
split
())
>
1
:
if
self
.
name
in
line
:
interface_list
.
append
(
line
.
split
()[
-
1
])
in_
bridg
e
=
True
in_
interfac
e
=
True
continue
if
in_
bridg
e
:
if
in_
interfac
e
:
break
elif
in_
bridg
e
:
elif
in_
interfac
e
:
if
line
.
strip
():
interface_list
.
append
(
line
.
strip
())
...
...
@@ -659,7 +660,7 @@ class Bridge(object):
callAndRead
([
'brctl'
,
'addif'
,
self
.
name
,
tap
.
name
])
def
_addSystemAddress
(
self
,
address
,
netmask
,
ipv6
=
True
):
"""Adds system address to
bridg
e
"""Adds system address to
interfac
e
Returns True if address was added successfully.
...
...
@@ -739,16 +740,16 @@ class Bridge(object):
def
addAddr
(
self
,
addr
=
None
,
netmask
=
None
):
"""
Adds IP address to
bridg
e.
Adds IP address to
interfac
e.
If addr is specified and exists already on
bridg
e does nothing.
If addr is specified and exists already on
interfac
e does nothing.
If addr is specified and does not exists on
bridg
e, tries to add given
If addr is specified and does not exists on
interfac
e, tries to add given
address. If it is not possible (ex. because network changed) calculates new
address.
Args:
addr: Wished address to be added to
bridg
e.
addr: Wished address to be added to
interfac
e.
netmask: Wished netmask to be used.
Returns:
...
...
@@ -756,33 +757,33 @@ class Bridge(object):
Raises:
AddressGenerationError: Couldn't construct valid address with existing
one's on the
bridg
e.
NoAddressOn
Bridge: There's no address on the bridg
e to construct
one's on the
interfac
e.
NoAddressOn
Interface: There's no address on the interfac
e to construct
an address with.
"""
# Getting one address of the
bridg
e as base of the next addresses
# Getting one address of the
interfac
e as base of the next addresses
if
self
.
ipv6_interface
:
interface_name
=
self
.
ipv6_interface
else
:
interface_name
=
self
.
name
bridg
e_addr_list
=
self
.
getGlobalScopeAddressList
()
interfac
e_addr_list
=
self
.
getGlobalScopeAddressList
()
# No address found
if
len
(
bridg
e_addr_list
)
==
0
:
raise
NoAddressOn
Bridg
e
(
interface_name
)
address_dict
=
bridg
e_addr_list
[
0
]
if
len
(
interfac
e_addr_list
)
==
0
:
raise
NoAddressOn
Interfac
e
(
interface_name
)
address_dict
=
interfac
e_addr_list
[
0
]
if
addr
is
not
None
:
if
dict
(
addr
=
addr
,
netmask
=
netmask
)
in
bridg
e_addr_list
:
if
dict
(
addr
=
addr
,
netmask
=
netmask
)
in
interfac
e_addr_list
:
# confirmed to be configured
return
dict
(
addr
=
addr
,
netmask
=
netmask
)
if
netmask
==
address_dict
[
'netmask'
]:
# same netmask, so there is a chance to add good one
bridg
e_network
=
netaddr
.
ip
.
IPNetwork
(
'%s/%s'
%
(
address_dict
[
'addr'
],
interfac
e_network
=
netaddr
.
ip
.
IPNetwork
(
'%s/%s'
%
(
address_dict
[
'addr'
],
netmaskToPrefixIPv6
(
address_dict
[
'netmask'
])))
requested_network
=
netaddr
.
ip
.
IPNetwork
(
'%s/%s'
%
(
addr
,
netmaskToPrefixIPv6
(
netmask
)))
if
bridg
e_network
.
network
==
requested_network
.
network
:
if
interfac
e_network
.
network
==
requested_network
.
network
:
# same network, try to add
if
self
.
_addSystemAddress
(
addr
,
netmask
):
# succeed, return it
...
...
@@ -871,19 +872,19 @@ def run(config):
'software_user'
:
'slapsoft'
,
})
computer_definition
.
read
(
filepath
)
bridg
e
=
None
interfac
e
=
None
address
=
None
netmask
=
None
if
computer_definition
.
has_option
(
'computer'
,
'address'
):
address
,
netmask
=
computer_definition
.
get
(
'computer'
,
'address'
).
split
(
'/'
)
if
config
.
alter_network
and
config
.
bridg
e_name
is
not
None
\
if
config
.
alter_network
and
config
.
interfac
e_name
is
not
None
\
and
config
.
ipv4_local_network
is
not
None
:
bridge
=
Bridge
(
config
.
bridg
e_name
,
config
.
ipv4_local_network
,
interface
=
Interface
(
config
.
interfac
e_name
,
config
.
ipv4_local_network
,
config
.
ipv6_interface
)
computer
=
Computer
(
reference
=
config
.
computer_id
,
bridge
=
bridg
e
,
interface
=
interfac
e
,
addr
=
address
,
netmask
=
netmask
,
ipv6_interface
=
config
.
ipv6_interface
,
...
...
@@ -914,8 +915,8 @@ def run(config):
config
.
computer_xml
,
))
computer
=
Computer
.
load
(
config
.
computer_xml
,
reference
=
config
.
computer_id
,
ipv6_interface
=
config
.
ipv6_interface
)
# Connect to the
bridge
interface defined by the configuration
computer
.
bridge
=
Bridge
(
config
.
bridg
e_name
,
config
.
ipv4_local_network
,
# Connect to the interface defined by the configuration
computer
.
interface
=
Interface
(
config
.
interfac
e_name
,
config
.
ipv4_local_network
,
config
.
ipv6_interface
)
else
:
# If no pre-existent configuration found, creating a new computer object
...
...
@@ -923,7 +924,7 @@ def run(config):
config
.
computer_id
,
))
computer
=
Computer
(
reference
=
config
.
computer_id
,
bridge
=
Bridge
(
config
.
bridg
e_name
,
config
.
ipv4_local_network
,
interface
=
Interface
(
config
.
interfac
e_name
,
config
.
ipv4_local_network
,
config
.
ipv6_interface
),
addr
=
None
,
netmask
=
None
,
...
...
@@ -1043,7 +1044,7 @@ class Config(object):
setattr
(
self
,
key
,
configuration_dict
[
key
])
# setup some nones
for
parameter
in
[
'
bridg
e_name'
,
'partition_base_name'
,
'user_base_name'
,
for
parameter
in
[
'
interfac
e_name'
,
'partition_base_name'
,
'user_base_name'
,
'tap_base_name'
,
'ipv4_local_network'
,
'ipv6_interface'
]:
if
getattr
(
self
,
parameter
,
None
)
is
None
:
setattr
(
self
,
parameter
,
None
)
...
...
@@ -1147,12 +1148,12 @@ def main(*args):
else
:
return
0
,
''
callAndRead
=
dry_callAndRead
real_addSystemAddress
=
Bridg
e
.
_addSystemAddress
real_addSystemAddress
=
Interfac
e
.
_addSystemAddress
def
fake_addSystemAddress
(
*
args
,
**
kw
):
real_addSystemAddress
(
*
args
,
**
kw
)
# Fake success
return
True
Bridg
e
.
_addSystemAddress
=
fake_addSystemAddress
Interfac
e
.
_addSystemAddress
=
fake_addSystemAddress
def
fake_getpwnam
(
user
):
class
result
(
object
):
pw_uid
=
12345
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment