]>
git.proxmox.com Git - mirror_ifupdown2.git/blob - ifupdown2/ifupdown/policymanager.py
3 # Copyright 2015-2017 Cumulus Networks, Inc. All rights reserved.
7 The PolicyManager should be subclassed by addon modules
8 to read a JSON policy config file that is later used to
11 Initialize: This module defines a list of config file location based
12 on module. There are defined in the __init__(): All the
13 addon modules need to do is import the policymanager module.
15 import ifupdown2.ifupdown.policymanager as policymanager
18 Provides: an API to retrieve link attributes based on addon module name,
19 interface name, and attribute.
21 The ifupdown.policymanager module provides a global object policymanager_api
22 that can be called like so:
24 speed_default = policymanager.policymanager_api.get_default(
25 module_name='ethtool',
36 class policymanager():
38 # we should check for these files in order
39 # so that customers can override the /var/lib file settings
40 self
.logger
= logging
.getLogger('ifupdown.' +
41 self
.__class
__.__name
__)
43 # we grab the json files from a known location and make sure that
44 # the defaults_policy is checked first
45 user_files
= glob
.glob('/etc/network/ifupdown2/policy.d/*.json')
46 # grab the default module files
47 default_files
= glob
.glob('/var/lib/ifupdown2/policy.d/*.json')
48 # keep an array of defaults indexed by module name
49 self
.system_policy_array
= {}
50 for filename
in default_files
:
53 with
open(filename
, 'r') as fd
:
54 system_array
= json
.load(fd
)
55 self
.logger
.debug('reading %s system policy defaults config' \
58 self
.logger
.warning('could not read %s system policy defaults config' \
60 self
.logger
.warning(' exception is %s' % str(e
))
62 for module
in system_array
.keys():
63 if self
.system_policy_array
.has_key(module
):
64 self
.logger
.debug('warning: overwriting system module %s from file %s' \
66 self
.system_policy_array
[module
] = system_array
[module
]
68 # take care of user defined policy defaults
69 self
.user_policy_array
= {}
70 for filename
in user_files
:
73 with
open(filename
, 'r') as fd
:
74 user_array
= json
.load(fd
)
75 self
.logger
.debug('reading %s policy user defaults config' \
78 self
.logger
.warning('could not read %s user policy defaults config' \
80 self
.logger
.warning(' exception is %s' % str(e
))
81 # customer added module attributes
82 for module
in user_array
.keys():
83 if self
.system_policy_array
.has_key(module
):
84 # warn user that we are overriding the system module setting
85 self
.logger
.debug('warning: overwriting system with user module %s from file %s' \
87 self
.user_policy_array
[module
] = user_array
[module
]
90 def get_iface_default(self
,module_name
=None,ifname
=None,attr
=None):
92 get_iface_default: Addon modules must use one of two types of access methods to
93 the default configs. In this method, we expect the default to be
95 [module]['iface_defaults'][ifname][attr] or
96 [module]['defaults'][attr]
97 We first check the user_policy_array and return that value. But if
98 the user did not specify an override, we use the system_policy_array.
100 # make sure we have an index
101 if (not ifname
or not attr
or not module_name
):
105 # users can specify defaults to override the systemwide settings
106 # look for user specific interface attribute iface_defaults first
108 # looks for user specified value
109 val
= self
.user_policy_array
[module_name
]['iface_defaults'][ifname
][attr
]
111 except (TypeError, KeyError, IndexError):
114 # failing that, there may be a user default for all intefaces
115 val
= self
.user_policy_array
[module_name
]['defaults'][attr
]
117 except (TypeError, KeyError, IndexError):
120 # failing that, look for system setting for the interface
121 val
= self
.system_policy_array
[module_name
]['iface_defaults'][ifname
][attr
]
123 except (TypeError, KeyError, IndexError):
126 # failing that, look for system setting for all interfaces
127 val
= self
.system_policy_array
[module_name
]['defaults'][attr
]
129 except (TypeError, KeyError, IndexError):
132 # could not find any system or user default so return Non
135 def get_attr_default(self
,module_name
=None,attr
=None):
137 get_attr_default: Addon modules must use one of two types of access methods to
138 the default configs. In this method, we expect the default to be in
140 [module]['defaults'][attr]
142 We first check the user_policy_array and return that value. But if
143 the user did not specify an override, we use the system_policy_array.
145 if (not attr
or not module_name
):
147 # users can specify defaults to override the systemwide settings
148 # look for user specific attribute defaults first
151 # looks for user specified value
152 val
= self
.user_policy_array
[module_name
]['defaults'][attr
]
154 except (TypeError, KeyError, IndexError):
157 # failing that, look for system setting
158 val
= self
.system_policy_array
[module_name
]['defaults'][attr
]
160 except (TypeError, KeyError, IndexError):
165 def get_module_globals(self
,module_name
=None,attr
=None):
167 get_module_globals: Addon modules must use one of two types of access methods to
168 the default configs. In this method, we expect the default to be in
170 [module]['module_globals'][attr]
172 We first check the user_policy_array and return that value. But if
173 the user did not specify an override, we use the system_policy_array.
176 if (not attr
or not module_name
):
178 # users can specify defaults to override the systemwide settings
179 # look for user specific attribute defaults first
182 # looks for user specified value
183 val
= self
.user_policy_array
[module_name
]['module_globals'][attr
]
185 except (TypeError, KeyError, IndexError):
188 # failing that, look for system setting
189 val
= self
.system_policy_array
[module_name
]['module_globals'][attr
]
191 except (TypeError, KeyError, IndexError):
196 def get_module_defaults(self
, module_name
):
198 get_module_defaults: returns a merged dictionary of default values
199 specified in policy files. Users provided values override system
204 raise NotImplementedError('get_module_defaults: module name can\'t be None')
207 defaults
.update(self
.system_policy_array
.get(module_name
, {}).get('defaults', {}))
208 defaults
.update(self
.user_policy_array
.get(module_name
, {}).get('defaults', {}))
211 def get_iface_defaults(self
, module_name
):
215 self
.logger
.info('get_iface_defaults: module name can\'t be None')
217 defaults
.update(self
.system_policy_array
.get(module_name
, {}).get('iface_defaults', {}))
218 defaults
.update(self
.user_policy_array
.get(module_name
, {}).get('iface_defaults', {}))
222 policymanager_api
= policymanager()
225 global policymanager_api
226 policymanager_api
= policymanager()