diff options
author | Marcel Enguehard <mengueha+fdio@cisco.com> | 2017-05-23 10:50:17 +0200 |
---|---|---|
committer | Marcel Enguehard <mengueha+fdio@cisco.com> | 2017-05-23 08:57:12 +0000 |
commit | be0b435d307173598c30fcacc421b17112137099 (patch) | |
tree | ed8aae7eef796eb7381d21937b095a036733789a /netmodel | |
parent | 895a6328d6e64948ed213e8fbbb3ab15aca0df43 (diff) |
Introduced groups + lxd profiles + diverted control network handling to lxd + misc bug fixes
Change-Id: Iae26bc2994ac9704dde7dfa8fbe4be1b74cf9e6f
Signed-off-by: Marcel Enguehard <mengueha+fdio@cisco.com>
Diffstat (limited to 'netmodel')
-rw-r--r-- | netmodel/model/collection.py | 28 | ||||
-rw-r--r-- | netmodel/util/file.py | 74 | ||||
-rw-r--r-- | netmodel/util/log.py | 12 |
3 files changed, 114 insertions, 0 deletions
diff --git a/netmodel/model/collection.py b/netmodel/model/collection.py new file mode 100644 index 00000000..21be84d8 --- /dev/null +++ b/netmodel/model/collection.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Copyright (c) 2017 Cisco and/or its affiliates. +# +# 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. +# + +from netmodel.model.filter import Filter + +class Collection(list): + """ + A collection corresponds to a list of objects, and includes processing functionalities to + manipulate them. + """ + + def filter(self, filter): + return filter.filter(self) diff --git a/netmodel/util/file.py b/netmodel/util/file.py new file mode 100644 index 00000000..4204d533 --- /dev/null +++ b/netmodel/util/file.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Copyright (c) 2017 Cisco and/or its affiliates. +# +# 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 errno +import logging +import os +import tempfile + +log = logging.getLogger(__name__) + +def mkdir(directory): + """ + Create a directory (mkdir -p). + Args: + directory: A String containing an absolute path. + Raises: + OSError: If the directory cannot be created. + """ + try: + if not os.path.exists(directory): + log.info("Creating '%s' directory" % directory) + os.makedirs(directory) + except OSError as e: + if e.errno == errno.EEXIST and os.path.isdir(directory): + pass + else: + raise OSError("Cannot mkdir %s: %s" % (directory, e)) + +def check_writable_directory(directory): + """ + Tests whether a directory is writable. + Args: + directory: A String containing an absolute path. + Raises: + RuntimeError: If the directory does not exists or isn't writable. + """ + if not os.path.exists(directory): + raise RuntimeError("Directory '%s' does not exists" % directory) + if not os.access(directory, os.W_OK | os.X_OK): + raise RuntimeError("Directory '%s' is not writable" % directory) + try: + with tempfile.TemporaryFile(dir = directory): + pass + except Exception as e: + raise RuntimeError("Cannot write into directory '%s': %s" % (directory, e)) + +def ensure_writable_directory(directory): + """ + Tests whether a directory exists and is writable. If not, + try to create such a directory. + Args: + directory: A String containing an absolute path. + Raises: + RuntimeError: If the directory does not exists and cannot be created. + """ + try: + check_writable_directory(directory) + except RuntimeError as e: + mkdir(directory) diff --git a/netmodel/util/log.py b/netmodel/util/log.py index 68eb9a7f..f9fa1e03 100644 --- a/netmodel/util/log.py +++ b/netmodel/util/log.py @@ -21,6 +21,17 @@ import logging.config import os import sys +from netmodel.util.file import ensure_writable_directory + +# Monkey-patch logging.FileHandler to support expanduser() +oldFileHandler = logging.FileHandler +class vICNFileHandler(oldFileHandler): + def __init__(self, filename, mode='a', encoding=None, delay=False): + filename = os.path.expanduser(filename) + ensure_writable_directory(os.path.dirname(filename)) + super().__init__(filename, mode, encoding, delay) +logging.FileHandler = vICNFileHandler + colors = { 'white': "\033[1;37m", 'yellow': "\033[1;33m", @@ -107,6 +118,7 @@ def initialize_logging(): if os.path.exists(config_path): logging.config.fileConfig(config_path, disable_existing_loggers=False) + root = logging.getLogger() root.setLevel(logging.DEBUG) |