Revision e60c73a1
b/lib/config.py | ||
---|---|---|
48 | 48 |
from ganeti import serializer |
49 | 49 |
from ganeti import uidpool |
50 | 50 |
from ganeti import netutils |
51 |
from ganeti import runtime |
|
51 | 52 |
|
52 | 53 |
|
53 | 54 |
_config_lock = locking.SharedLock("ConfigWriter") |
... | ... | |
134 | 135 |
@ivar _all_rms: a list of all temporary reservation managers |
135 | 136 |
|
136 | 137 |
""" |
137 |
def __init__(self, cfg_file=None, offline=False): |
|
138 |
def __init__(self, cfg_file=None, offline=False, _getents=runtime.GetEnts):
|
|
138 | 139 |
self.write_count = 0 |
139 | 140 |
self._lock = _config_lock |
140 | 141 |
self._config_data = None |
... | ... | |
143 | 144 |
self._cfg_file = constants.CLUSTER_CONF_FILE |
144 | 145 |
else: |
145 | 146 |
self._cfg_file = cfg_file |
147 |
self._getents = _getents |
|
146 | 148 |
self._temporary_ids = TemporaryReservationManager() |
147 | 149 |
self._temporary_drbds = {} |
148 | 150 |
self._temporary_macs = TemporaryReservationManager() |
... | ... | |
1342 | 1344 |
self._BumpSerialNo() |
1343 | 1345 |
txt = serializer.Dump(self._config_data.ToDict()) |
1344 | 1346 |
|
1345 |
utils.WriteFile(destination, data=txt) |
|
1347 |
getents = self._getents() |
|
1348 |
utils.WriteFile(destination, data=txt, gid=getents.confd_gid, mode=0640) |
|
1346 | 1349 |
|
1347 | 1350 |
self.write_count += 1 |
1348 | 1351 |
|
b/test/ganeti.config_unittest.py | ||
---|---|---|
38 | 38 |
from ganeti import netutils |
39 | 39 |
|
40 | 40 |
import testutils |
41 |
import mocks |
|
42 |
|
|
43 |
|
|
44 |
def _StubGetEntResolver(): |
|
45 |
return mocks.FakeGetentResolver() |
|
41 | 46 |
|
42 | 47 |
|
43 | 48 |
class TestConfigRunner(unittest.TestCase): |
... | ... | |
55 | 60 |
|
56 | 61 |
def _get_object(self): |
57 | 62 |
"""Returns a instance of ConfigWriter""" |
58 |
cfg = config.ConfigWriter(cfg_file=self.cfg_file, offline=True) |
|
63 |
cfg = config.ConfigWriter(cfg_file=self.cfg_file, offline=True, |
|
64 |
_getents=_StubGetEntResolver) |
|
59 | 65 |
return cfg |
60 | 66 |
|
61 | 67 |
def _init_cluster(self, cfg): |
b/test/mocks.py | ||
---|---|---|
21 | 21 |
|
22 | 22 |
"""Module implementing a fake ConfigWriter""" |
23 | 23 |
|
24 |
|
|
25 |
import os |
|
26 |
|
|
24 | 27 |
from ganeti import utils |
25 | 28 |
from ganeti import netutils |
26 | 29 |
|
... | ... | |
79 | 82 |
self.cfg = FakeConfig() |
80 | 83 |
# TODO: decide what features a mock Ganeti Lock Manager must have |
81 | 84 |
self.GLM = None |
85 |
|
|
86 |
|
|
87 |
class FakeGetentResolver: |
|
88 |
"""Fake runtime.GetentResolver""" |
|
89 |
|
|
90 |
def __init__(self): |
|
91 |
# As we nomally don't run under root we use our own uid/gid for all |
|
92 |
# fields. This way we don't run into permission denied problems. |
|
93 |
uid = os.getuid() |
|
94 |
gid = os.getgid() |
|
95 |
|
|
96 |
self.masterd_uid = uid |
|
97 |
self.masterd_gid = gid |
|
98 |
self.confd_uid = uid |
|
99 |
self.confd_gid = gid |
|
100 |
self.rapi_uid = uid |
|
101 |
self.rapi_gid = gid |
|
102 |
self.noded_uid = uid |
|
103 |
|
|
104 |
self.daemons_gid = gid |
|
105 |
self.admin_gid = gid |
Also available in: Unified diff