summaryrefslogtreecommitdiffstats
path: root/os_net_config
diff options
context:
space:
mode:
authorDan Prince <dprince@redhat.com>2014-07-01 16:54:25 -0400
committerDan Prince <dprince@redhat.com>2014-07-01 16:54:25 -0400
commit50290b0e45429c207a5640979f3b0eee7aabfe20 (patch)
treeb099344a07ec7bec47832a055c25d820313b49ae /os_net_config
parenta58503a27b67571b8a534b43fc7e614b5557b64e (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__.py20
-rwxr-xr-xos_net_config/cli.py103
-rw-r--r--os_net_config/impl_iproute.py19
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."""