summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cloudinit/net/__init__.py2
-rw-r--r--cloudinit/net/network_state.py39
-rw-r--r--cloudinit/sources/helpers/openstack.py5
3 files changed, 30 insertions, 16 deletions
diff --git a/cloudinit/net/__init__.py b/cloudinit/net/__init__.py
index 31544fd8..cc154c57 100644
--- a/cloudinit/net/__init__.py
+++ b/cloudinit/net/__init__.py
@@ -262,7 +262,7 @@ def parse_deb_config(path):
def parse_net_config_data(net_config):
- """Parses the config, returns NetworkState dictionary
+ """Parses the config, returns NetworkState object
:param net_config: curtin network config dict
"""
diff --git a/cloudinit/net/network_state.py b/cloudinit/net/network_state.py
index d08e94fe..27d35256 100644
--- a/cloudinit/net/network_state.py
+++ b/cloudinit/net/network_state.py
@@ -15,6 +15,8 @@
# You should have received a copy of the GNU Affero General Public License
# along with Curtin. If not, see <http://www.gnu.org/licenses/>.
+import six
+
from cloudinit import log as logging
from cloudinit import util
from cloudinit.util import yaml_dumps as dump_config
@@ -32,11 +34,31 @@ def from_state_file(state_file):
state = util.read_conf(state_file)
network_state = NetworkState()
network_state.load(state)
-
return network_state
-class NetworkState:
+class CommandHandlerMeta(type):
+ """Metaclass that dynamically creates a 'command_handlers' attribute.
+
+ This will scan the to-be-created class for methods that start with
+ 'handle_' and on finding those will populate a class attribute mapping
+ so that those methods can be quickly located and called.
+ """
+ def __new__(cls, name, parents, dct):
+ command_handlers = {}
+ for attr_name, attr in six.iteritems(dct):
+ if six.callable(attr) and attr_name.startswith('handle_'):
+ handles_what = attr_name[len('handle_'):]
+ if handles_what:
+ command_handlers[handles_what] = attr
+ dct['command_handlers'] = command_handlers
+ return super(CommandHandlerMeta, cls).__new__(cls, name,
+ parents, dct)
+
+
+@six.add_metaclass(CommandHandlerMeta)
+class NetworkState(object):
+
def __init__(self, version=NETWORK_STATE_VERSION, config=None):
self.version = version
self.config = config
@@ -48,18 +70,6 @@ class NetworkState:
'search': [],
}
}
- self.command_handlers = self.get_command_handlers()
-
- def get_command_handlers(self):
- METHOD_PREFIX = 'handle_'
- methods = filter(lambda x: callable(getattr(self, x)) and
- x.startswith(METHOD_PREFIX), dir(self))
- handlers = {}
- for m in methods:
- key = m.replace(METHOD_PREFIX, '')
- handlers[key] = getattr(self, m)
-
- return handlers
def dump(self):
state = {
@@ -83,7 +93,6 @@ class NetworkState:
# v1 - direct attr mapping, except version
for key in [k for k in required_keys if k not in ['version']]:
setattr(self, key, state[key])
- self.command_handlers = self.get_command_handlers()
def dump_network_state(self):
return dump_config(self.network_state)
diff --git a/cloudinit/sources/helpers/openstack.py b/cloudinit/sources/helpers/openstack.py
index 475ccab3..845ea971 100644
--- a/cloudinit/sources/helpers/openstack.py
+++ b/cloudinit/sources/helpers/openstack.py
@@ -576,6 +576,11 @@ def convert_net_json(network_json):
'vlan_id': link['vlan_id'],
'mac_address': link['vlan_mac_address'],
})
+ elif link['type'] in ['bridge']:
+ cfg.update({
+ 'type': 'bridge',
+ 'mac_address': link['ethernet_mac_address'],
+ 'mtu': link['mtu']})
else:
raise ValueError(
'Unknown network_data link type: %s' % link['type'])