diff options
author | Dan Prince <dprince@redhat.com> | 2014-07-01 16:54:25 -0400 |
---|---|---|
committer | Dan Prince <dprince@redhat.com> | 2014-07-01 16:54:25 -0400 |
commit | 50290b0e45429c207a5640979f3b0eee7aabfe20 (patch) | |
tree | b099344a07ec7bec47832a055c25d820313b49ae /os_net_config | |
parent | a58503a27b67571b8a534b43fc7e614b5557b64e (diff) |
Add os-net-config CLI
Adds a new CLI which parses the JSON and calls the configured
provider to apply the configuration.
Diffstat (limited to 'os_net_config')
-rw-r--r-- | os_net_config/__init__.py | 20 | ||||
-rwxr-xr-x | os_net_config/cli.py | 103 | ||||
-rw-r--r-- | os_net_config/impl_iproute.py | 19 |
3 files changed, 140 insertions, 2 deletions
diff --git a/os_net_config/__init__.py b/os_net_config/__init__.py index e2232e4..484863a 100644 --- a/os_net_config/__init__.py +++ b/os_net_config/__init__.py @@ -15,6 +15,8 @@ import pbr.version +from os_net_config import objects + __version__ = pbr.version.VersionInfo( 'os_net_config').version_string() @@ -26,16 +28,30 @@ class NotImplemented(Exception): class NetConfig(object): """Configure network interfaces using the ifcfg format.""" + def addObject(self, obj): + if isinstance(obj, objects.Interface): + self.addInterface(obj) + elif isinstance(obj, objects.Vlan): + self.addVlan(obj) + elif isinstance(obj, objects.OvsBridge): + self.addBridge(obj) + for member in obj.members: + self.addObject(member) + elif isinstance(obj, objects.OvsBond): + self.addBond(obj) + for member in obj.members: + self.addObject(member) + def addInterface(self, interface): raise NotImplemented("addInterface is not implemented.") - def addVlan(self, bridge): + def addVlan(self, vlan): raise NotImplemented("addVlan is not implemented.") def addBridge(self, bridge): raise NotImplemented("addBridge is not implemented.") - def addBond(self, bridge): + def addBond(self, bond): raise NotImplemented("addBond is not implemented.") def apply(self): diff --git a/os_net_config/cli.py b/os_net_config/cli.py new file mode 100755 index 0000000..211322b --- /dev/null +++ b/os_net_config/cli.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- + +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + + +import argparse +import json +import logging +import os +import sys + +import os_net_config +from os_net_config import impl_eni +from os_net_config import impl_ifcfg +from os_net_config import impl_iproute +from os_net_config import objects + + +def parse_opts(argv): + parser = argparse.ArgumentParser( + description='Configure host network interfaces using a JSON' + ' config file format.') + parser.add_argument('-c', '--config-file', metavar='CONFIG_FILE', + help="""path to the configuration file.""", + default='/etc/os-net-config/config.json') + parser.add_argument('-p', '--provider', metavar='PROVIDER', + help="""The provider to use.""" + """One of: ifcfg, eni, iproute.""", + default=None) + parser.add_argument('--version', action='version', + version=os_net_config.__version__) + opts = parser.parse_args(argv[1:]) + + return opts + + +def main(argv=sys.argv): + opts = parse_opts(argv) + logger.info('Using config file at: %s' % opts.config_file) + iface_array = [] + + provider = None + if opts.provider: + if opts.provider == 'ifcfg': + provider = impl_ifcfg.IfcfgNetConfig() + elif opts.provider == 'eni': + provider = impl_eni.ENINetConfig() + elif opts.provider == 'iproute': + provider = impl_iproute.IprouteNetConfig() + else: + logger.error('Invalid provider specified.') + return 1 + else: + if os.path.exists('/etc/sysconfig/network-scripts/'): + provider = impl_ifcfg.IfcfgNetConfig() + elif os.path.exists('/etc/network/'): + provider = impl_eni.ENINetConfig() + else: + logger.error('Unable to set provider for this operating system.') + return 1 + + if os.path.exists(opts.config_file): + with open(opts.config_file) as cf: + iface_array = json.loads(cf.read()).get("network_config") + logger.debug('network_config JSON: %s' % str(iface_array)) + else: + logger.error('No config file exists at: %s' % opts.config_file) + return 1 + if not isinstance(iface_array, list): + logger.error('No interfaces defined in config: %s' % opts.config_file) + return 1 + for iface_json in iface_array: + obj = objects.object_from_json(iface_json) + provider.addObject(obj) + provider.apply() + return 0 + + +LOG_FORMAT = '[%(asctime)s] [%(levelname)s] %(message)s' +DATE_FORMAT = '%Y/%m/%d %I:%M:%S %p' + + +def add_handler(logger, handler): + handler.setFormatter(logging.Formatter(LOG_FORMAT, datefmt=DATE_FORMAT)) + logger.addHandler(handler) +logger = logging.getLogger('os-net-config') +logger.setLevel(logging.INFO) +add_handler(logger, logging.StreamHandler()) +if os.geteuid() == 0: + add_handler(logger, logging.FileHandler('/var/log/os-net-config.log')) + +if __name__ == '__main__': + sys.exit(main(sys.argv)) diff --git a/os_net_config/impl_iproute.py b/os_net_config/impl_iproute.py new file mode 100644 index 0000000..33f302e --- /dev/null +++ b/os_net_config/impl_iproute.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- + +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import os_net_config + + +class IprouteNetConfig(os_net_config.NetConfig): + """Configure network interfaces using iproute2.""" |