~cloud-init-dev/cloud-init/trunk

« back to all changes in this revision

Viewing changes to cloudinit/sources/helpers/vmware/imc/config_file.py

  • Committer: Scott Moser
  • Date: 2016-08-10 15:06:15 UTC
  • Revision ID: smoser@ubuntu.com-20160810150615-ma2fv107w3suy1ma
README: Mention move of revision control to git.

cloud-init development has moved its revision control to git.
It is available at 
  https://code.launchpad.net/cloud-init

Clone with 
  git clone https://git.launchpad.net/cloud-init
or
  git clone git+ssh://git.launchpad.net/cloud-init

For more information see
  https://git.launchpad.net/cloud-init/tree/HACKING.rst

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# vi: ts=4 expandtab
2
 
#
3
 
#    Copyright (C) 2015 Canonical Ltd.
4
 
#    Copyright (C) 2015 VMware Inc.
5
 
#
6
 
#    Author: Sankar Tanguturi <stanguturi@vmware.com>
7
 
#
8
 
#    This program is free software: you can redistribute it and/or modify
9
 
#    it under the terms of the GNU General Public License version 3, as
10
 
#    published by the Free Software Foundation.
11
 
#
12
 
#    This program is distributed in the hope that it will be useful,
13
 
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 
#    GNU General Public License for more details.
16
 
#
17
 
#    You should have received a copy of the GNU General Public License
18
 
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
 
 
20
 
import logging
21
 
 
22
 
try:
23
 
    import configparser
24
 
except ImportError:
25
 
    import ConfigParser as configparser
26
 
 
27
 
from .config_source import ConfigSource
28
 
 
29
 
logger = logging.getLogger(__name__)
30
 
 
31
 
 
32
 
class ConfigFile(ConfigSource, dict):
33
 
    """ConfigFile module to load the content from a specified source."""
34
 
 
35
 
    def __init__(self, filename):
36
 
        self._loadConfigFile(filename)
37
 
        pass
38
 
 
39
 
    def _insertKey(self, key, val):
40
 
        """
41
 
        Inserts a Key Value pair.
42
 
 
43
 
        Keyword arguments:
44
 
        key -- The key to insert
45
 
        val -- The value to insert for the key
46
 
 
47
 
        """
48
 
        key = key.strip()
49
 
        val = val.strip()
50
 
 
51
 
        if key.startswith('-') or '|-' in key:
52
 
            canLog = False
53
 
        else:
54
 
            canLog = True
55
 
 
56
 
        # "sensitive" settings shall not be logged
57
 
        if canLog:
58
 
            logger.debug("ADDED KEY-VAL :: '%s' = '%s'" % (key, val))
59
 
        else:
60
 
            logger.debug("ADDED KEY-VAL :: '%s' = '*****************'" % key)
61
 
 
62
 
        self[key] = val
63
 
 
64
 
    def _loadConfigFile(self, filename):
65
 
        """
66
 
        Parses properties from the specified config file.
67
 
 
68
 
        Any previously available properties will be removed.
69
 
        Sensitive data will not be logged in case the key starts
70
 
        from '-'.
71
 
 
72
 
        Keyword arguments:
73
 
        filename - The full path to the config file.
74
 
        """
75
 
        logger.info('Parsing the config file %s.' % filename)
76
 
 
77
 
        config = configparser.ConfigParser()
78
 
        config.optionxform = str
79
 
        config.read(filename)
80
 
 
81
 
        self.clear()
82
 
 
83
 
        for category in config.sections():
84
 
            logger.debug("FOUND CATEGORY = '%s'" % category)
85
 
 
86
 
            for (key, value) in config.items(category):
87
 
                self._insertKey(category + '|' + key, value)
88
 
 
89
 
    def should_keep_current_value(self, key):
90
 
        """
91
 
        Determines whether a value for a property must be kept.
92
 
 
93
 
        If the propery is missing, it is treated as it should be not
94
 
        changed by the engine.
95
 
 
96
 
        Keyword arguments:
97
 
        key -- The key to search for.
98
 
        """
99
 
        # helps to distinguish from "empty" value which is used to indicate
100
 
        # "removal"
101
 
        return key not in self
102
 
 
103
 
    def should_remove_current_value(self, key):
104
 
        """
105
 
        Determines whether a value for the property must be removed.
106
 
 
107
 
        If the specified key is empty, it is treated as it should be
108
 
        removed by the engine.
109
 
 
110
 
        Return true if the value can be removed, false otherwise.
111
 
 
112
 
        Keyword arguments:
113
 
        key -- The key to search for.
114
 
        """
115
 
        # helps to distinguish from "missing" value which is used to indicate
116
 
        # "keeping unchanged"
117
 
        if key in self:
118
 
            return not bool(self[key])
119
 
        else:
120
 
            return False
121
 
 
122
 
    def get_count_with_prefix(self, prefix):
123
 
        """
124
 
        Return the total count of keys that start with the specified prefix.
125
 
 
126
 
        Keyword arguments:
127
 
        prefix -- prefix of the key
128
 
        """
129
 
        return len([key for key in self if key.startswith(prefix)])