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