~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/canonical/launchpad/doc/canonical-config.txt

  • Committer: Stuart Bishop
  • Date: 2011-09-28 12:49:24 UTC
  • mfrom: (9893.10.1 trivial)
  • mto: This revision was merged to the branch mainline in revision 14178.
  • Revision ID: stuart.bishop@canonical.com-20110928124924-m5a22fymqghw6c5i
Merged trivial into distinct-db-users.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
= Canonical Config =
 
1
Canonical Config
 
2
================
2
3
 
3
4
`canonical.config` provides singleton access to the Launchpad
4
5
configuration, accessed via the `config` module global. It is
6
7
correct config.
7
8
 
8
9
 
9
 
== CanonicalConfig AKA config ==
 
10
CanonicalConfig AKA config
 
11
--------------------------
10
12
 
11
 
CanonicalConfig is a singleton that manages access to the config.
12
 
Cached copies are kept in thread locals ensuring the configuration
13
 
is thread safe (not that this will be a problem if we stick with
14
 
simple configuration).
 
13
CanonicalConfig is a singleton that manages access to the config. Cached
 
14
copies are kept in thread locals ensuring the configuration is thread
 
15
safe (not that this will be a problem if we stick with simple
 
16
configuration).
15
17
 
16
18
    >>> from canonical.config import config
17
19
    >>> from canonical.testing.layers import DatabaseLayer
19
21
    ...     'dbname=%s host=localhost' % DatabaseLayer._db_fixture.dbname)
20
22
    >>> expected == config.database.rw_main_master
21
23
    True
 
24
 
22
25
    >>> config.database.db_statement_timeout is None
23
26
    True
 
27
 
24
28
    >>> config.launchpad.dbuser
25
29
    'launchpad_main'
 
30
 
26
31
    >>> config.librarian.dbuser
27
32
    'librarian'
28
33
 
40
45
otherwise it loads launchpad-lazr.conf. The general rule is
41
46
configs/<instance_name>/<process_name>.conf. The testrunner sets the
42
47
instance_name to 'testrunner' and additionally uses unique temporary
43
 
configs to permit changing the config during tests (but not if we
44
 
are using persistent helpers - see canonical.testing.layers).
 
48
configs to permit changing the config during tests (but not if we are
 
49
using persistent helpers - see canonical.testing.layers).
45
50
 
46
51
    >>> (config.instance_name == 'testrunner' or
47
 
    ...  config.instance_name == os.environ['LPCONFIG'])
 
52
    ...     config.instance_name == os.environ['LPCONFIG'])
48
53
    True
 
54
 
49
55
    >>> config.process_name
50
56
    'test'
51
57
 
52
58
    >>> config.filename
53
59
    '.../launchpad-lazr.conf'
 
60
 
54
61
    >>> config.extends.filename
55
62
    '.../launchpad-lazr.conf'
56
63
 
69
76
    >>> example_path = canonical.config.__file__
70
77
    >>> config.root in example_path
71
78
    True
 
79
 
72
80
    >>> example_path[len(config.root):]
73
81
    '/lib/canonical/...'
74
82
 
77
85
 
78
86
    >>> config.devmode
79
87
    True
 
88
 
80
89
    >>> len(config.servers)
81
90
    4
 
91
 
82
92
    >>> config.threads
83
93
    4
84
94
 
85
 
== Working with test configurations ==
86
 
 
87
 
Tests can update the config with test data. For example, the domain
88
 
can be changed for a feature.
 
95
 
 
96
Working with test configurations
 
97
--------------------------------
 
98
 
 
99
Tests can update the config with test data. For example, the domain can
 
100
be changed for a feature.
89
101
 
90
102
    >>> test_data = ("""
91
103
    ...     [answertracker]
98
110
 
99
111
    >>> config.pop('test_data')
100
112
    (<lazr.config...ConfigData ...>,)
 
113
 
101
114
    >>> config.answertracker.email_domain
102
115
    'answers.launchpad.net'
103
116
 
104
117
 
105
 
== Selecting the conf file with instance and process names ==
 
118
Selecting the conf file with instance and process names
 
119
-------------------------------------------------------
106
120
 
107
 
The name of the conf file, and the directory from which is resides,
108
 
is controlled by the config's process_name and instance_name. These
109
 
may be set by their corresponding methods, *before* accessing the
110
 
config, to set where the config values are loaded from. After the
111
 
config is loaded, changing the instance and process names will have
112
 
no affect.
 
121
The name of the conf file, and the directory from which is resides, is
 
122
controlled by the config's process_name and instance_name. These may be
 
123
set by their corresponding methods, *before* accessing the config, to
 
124
set where the config values are loaded from. After the config is loaded,
 
125
changing the instance and process names will have no affect.
113
126
 
114
127
Setting just the instance_name will change the directory from which the
115
128
conf file is loaded.
122
135
 
123
136
    >>> test_config.filename
124
137
    '.../configs/development/launchpad-lazr.conf'
 
138
 
125
139
    >>> test_config.extends.filename
126
140
    '.../config/schema-lazr.conf'
127
141
 
144
158
 
145
159
    >>> test_config.filename
146
160
    '.../configs/testrunner/test-process-lazr.conf'
 
161
 
147
162
    >>> test_config.extends.filename
148
163
    '.../configs/testrunner/launchpad-lazr.conf'
149
164
 
150
165
    >>> test_config.answertracker.days_before_expiration
151
166
    300
152
167
 
153
 
The default 'launchpad-lazr.conf' is loaded if no conf files match
154
 
the process's name.
 
168
The default 'launchpad-lazr.conf' is loaded if no conf files match the
 
169
process's name.
155
170
 
156
171
    >>> test_config.setInstance('testrunner')
157
172
    >>> test_config.instance_name
163
178
 
164
179
    >>> test_config.filename
165
180
    '.../configs/testrunner/launchpad-lazr.conf'
 
181
 
166
182
    >>> test_config.extends.filename
167
183
    '.../configs/development/launchpad-lazr.conf'
168
184
 
169
185
    >>> test_config.answertracker.days_before_expiration
170
186
    15
171
187
 
172
 
    >>> # setInstance sets the LPCONFIG environment variable, so set it
173
 
    >>> # back to the real value.
174
188
    >>> config.setInstance(config.instance_name)
175
189
 
176
190
The initial instance_name is set via the LPCONFIG environment variable.
177
191
Because Config is designed to failover to the default development
178
 
environment, and the testrunner overrides the environment and config,
179
 
we need to reconfigure the environment and reload the canonical.config
 
192
environment, and the testrunner overrides the environment and config, we
 
193
need to reconfigure the environment and reload the canonical.config
180
194
module to test CanonicalConfig's behaviour.
181
195
 
182
196
Alternatively, the instance name and process name can be specified as
185
199
    >>> dev_config = CanonicalConfig('development', 'authserver')
186
200
    >>> dev_config.instance_name
187
201
    'development'
 
202
 
188
203
    >>> dev_config.process_name
189
204
    'authserver'
190
205
 
193
208
 
194
209
# XXX sinzui 2008-03-25 bug=78545: This cannot be tested until the
195
210
# config can be restored when this test is torn down.
196
 
 
197
211
#    >>> true_config = config
198
212
#    >>> import os
199
213
#    >>> from canonical.config import LPCONFIG, DEFAULT_SECTION
203
217
#    # reload the CanonicalConfig class object.
204
218
#    >>> config_module = reload(canonical.config)
205
219
#    >>> from canonical.config import config
206
 
 
207
220
#    >>> config.filename
208
221
#    '.../configs/mailman-itests/launchpad-lazr.conf'
209
222
#    >>> config.extends.filename
219
232
#    <SectionValue for canonical 'default'>
220
233
#    >>> config._cache.testrunner
221
234
#    Traceback (most recent call last):
222
 
#     ...
 
235
#    ...
223
236
#    AttributeError: 'zope.thread.local' object has no attribute 'testrunner'
224
237
 
225
238
#We need to reset the config for the testrunner.