root / snf-docs / asterias-dev-guide.rst @ 9940eacf
History | View | Annotate | Download (15.8 kB)
1 | 442b6550 | Vangelis Koukis | .. _asterias-developer-guide: |
---|---|---|---|
2 | 99644884 | Vangelis Koukis | |
3 | 99644884 | Vangelis Koukis | =============== |
4 | 99644884 | Vangelis Koukis | Developer Guide |
5 | 99644884 | Vangelis Koukis | =============== |
6 | 99644884 | Vangelis Koukis | |
7 | 99644884 | Vangelis Koukis | This is the asterias developer guide. |
8 | 99644884 | Vangelis Koukis | |
9 | 99644884 | Vangelis Koukis | It is intended for developers, wishing to implement new functionality |
10 | 442b6550 | Vangelis Koukis | inside :ref:`asterias <asterias>`. |
11 | 99644884 | Vangelis Koukis | |
12 | 442b6550 | Vangelis Koukis | It assumes thorough familiarity with the :ref:`asterias-admin-guide`. |
13 | 99644884 | Vangelis Koukis | |
14 | 99644884 | Vangelis Koukis | Building a dev environment |
15 | 99644884 | Vangelis Koukis | -------------------------- |
16 | 99644884 | Vangelis Koukis | |
17 | 99644884 | Vangelis Koukis | virtualenv |
18 | 99644884 | Vangelis Koukis | ********** |
19 | 99644884 | Vangelis Koukis | |
20 | 99644884 | Vangelis Koukis | The easiest method to deploy a development environment is using |
21 | 99644884 | Vangelis Koukis | :command:`virtualenv`. Alternatively, you can use your system's package manager |
22 | 99644884 | Vangelis Koukis | to install any dependencies of synnefo components (e.g. Macports has them all). |
23 | 99644884 | Vangelis Koukis | |
24 | 99644884 | Vangelis Koukis | .. code-block:: console |
25 | 99644884 | Vangelis Koukis | |
26 | 99644884 | Vangelis Koukis | $ virtualenv ~/synnefo-env |
27 | 99644884 | Vangelis Koukis | $ . ~/synnefo-env/bin/activate |
28 | 99644884 | Vangelis Koukis | (synnefo-env)$ |
29 | 99644884 | Vangelis Koukis | |
30 | 99644884 | Vangelis Koukis | Any :command:`pip` commands executed from now on, affect the ``synnefo-env`` |
31 | 99644884 | Vangelis Koukis | virtualenv. |
32 | 99644884 | Vangelis Koukis | |
33 | 99644884 | Vangelis Koukis | * It is also recommended to install development helpers: |
34 | 99644884 | Vangelis Koukis | |
35 | 99644884 | Vangelis Koukis | .. code-block:: console |
36 | 99644884 | Vangelis Koukis | |
37 | 99644884 | Vangelis Koukis | (synnefo-env)$ pip install django_extensions |
38 | 99644884 | Vangelis Koukis | |
39 | 99644884 | Vangelis Koukis | * Create a custom settings directory for :ref:`snf-common <snf-common>` and set |
40 | 99644884 | Vangelis Koukis | the ``SYNNEFO_SETTINGS_DIR`` environment variable to use development-specific |
41 | 99644884 | Vangelis Koukis | file:`*.conf` files inside this directory. |
42 | 99644884 | Vangelis Koukis | |
43 | 99644884 | Vangelis Koukis | (synnefo-env)$ mkdir ~/synnefo-settings-dir |
44 | 99644884 | Vangelis Koukis | (synnefo-env)$ export SYNNEFO_SETTINGS_DIR=~/synnefo-settings-dir |
45 | 99644884 | Vangelis Koukis | |
46 | 99644884 | Vangelis Koukis | Insert your custom settings in a file such as :file:`$SYNNEFO_SETTINGS_DIR/99-local.conf`: |
47 | 99644884 | Vangelis Koukis | |
48 | 99644884 | Vangelis Koukis | .. code-block:: python |
49 | 99644884 | Vangelis Koukis | |
50 | 99644884 | Vangelis Koukis | # uncomment this if have django-extensions installed (pip install django_extensions) |
51 | 99644884 | Vangelis Koukis | #INSTALLED_APPS = list(INSTALLED_APPS) + ['django_extensions'] |
52 | 99644884 | Vangelis Koukis | |
53 | 99644884 | Vangelis Koukis | DEV_PATH = os.path.abspath(os.path.dirname(__file__)) |
54 | 99644884 | Vangelis Koukis | DATABASES['default']['NAME'] = os.path.join(DEV_PATH, "synnefo.sqlite") |
55 | 99644884 | Vangelis Koukis | |
56 | 99644884 | Vangelis Koukis | # development rabitmq configuration |
57 | 99644884 | Vangelis Koukis | RABBIT_HOST = "<RabbitMQ_host>" |
58 | 99644884 | Vangelis Koukis | RABBIT_USERNAME = "<RabbitMQ_username>" |
59 | 99644884 | Vangelis Koukis | RABBIT_PASSWORD = "<RabbitMQ_password>" |
60 | 99644884 | Vangelis Koukis | RABBIT_VHOST = "/" |
61 | 99644884 | Vangelis Koukis | |
62 | 99644884 | Vangelis Koukis | # development ganeti settings |
63 | 99644884 | Vangelis Koukis | GANETI_MASTER_IP = "<Ganeti_master_IP>" |
64 | 99644884 | Vangelis Koukis | GANETI_CLUSTER_INFO = (GANETI_MASTER_IP, 5080, "<username>", "<password>") |
65 | 99644884 | Vangelis Koukis | GANETI_CREATEINSTANCE_KWARGS['disk_template'] = 'plain' |
66 | 99644884 | Vangelis Koukis | |
67 | 99644884 | Vangelis Koukis | # This prefix gets used when determining the instance names |
68 | 99644884 | Vangelis Koukis | # of Synnefo VMs at the Ganeti backend. |
69 | 99644884 | Vangelis Koukis | # The dash must always appear in the name! |
70 | 99644884 | Vangelis Koukis | BACKEND_PREFIX_ID = "<your_commit_name>-" |
71 | 99644884 | Vangelis Koukis | |
72 | 99644884 | Vangelis Koukis | IGNORE_FLAVOR_DISK_SIZES = True |
73 | 99644884 | Vangelis Koukis | |
74 | 99644884 | Vangelis Koukis | # do not actually send emails |
75 | 99644884 | Vangelis Koukis | # save them as files in /tmp/synnefo-mails |
76 | 99644884 | Vangelis Koukis | EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend' |
77 | 99644884 | Vangelis Koukis | EMAIL_FILE_PATH = '/tmp/synnefo-mails' |
78 | 99644884 | Vangelis Koukis | |
79 | 99644884 | Vangelis Koukis | # for UI developers |
80 | 99644884 | Vangelis Koukis | UI_HANDLE_WINDOW_EXCEPTIONS = False |
81 | 99644884 | Vangelis Koukis | |
82 | 99644884 | Vangelis Koukis | # allow login using /?test url |
83 | 99644884 | Vangelis Koukis | BYPASS_AUTHENTICATION = True |
84 | 99644884 | Vangelis Koukis | |
85 | 99644884 | Vangelis Koukis | synnefo source |
86 | 99644884 | Vangelis Koukis | ************** |
87 | 99644884 | Vangelis Koukis | |
88 | 99644884 | Vangelis Koukis | * Clone the repository of the synnefo software components you wish |
89 | 99644884 | Vangelis Koukis | to work on, e.g.: |
90 | 99644884 | Vangelis Koukis | |
91 | 442b6550 | Vangelis Koukis | .. code-block:: console |
92 | 442b6550 | Vangelis Koukis | |
93 | 442b6550 | Vangelis Koukis | (synnefo-env)$ git clone https://code.grnet.gr/git/synnefo synnefo |
94 | 442b6550 | Vangelis Koukis | |
95 | 99644884 | Vangelis Koukis | * Install the software components you wish to work on inside the |
96 | 99644884 | Vangelis Koukis | virtualenv, in development mode: |
97 | 99644884 | Vangelis Koukis | |
98 | 442b6550 | Vangelis Koukis | .. code-block:: console |
99 | 442b6550 | Vangelis Koukis | |
100 | 442b6550 | Vangelis Koukis | (synnefo-env)$ cd snf-asterias-app |
101 | 442b6550 | Vangelis Koukis | (synnefo-env)$ python setup.py develop -N |
102 | 442b6550 | Vangelis Koukis | |
103 | 442b6550 | Vangelis Koukis | * Initialize database: |
104 | 99644884 | Vangelis Koukis | |
105 | 442b6550 | Vangelis Koukis | .. code-block:: console |
106 | 442b6550 | Vangelis Koukis | |
107 | 442b6550 | Vangelis Koukis | (synnefo-env)$ snf-manage syndb |
108 | 442b6550 | Vangelis Koukis | (synnefo-env)$ snf-manage migrate |
109 | 442b6550 | Vangelis Koukis | (synnefo-env)$ snf-manage loaddata users flavors images |
110 | 442b6550 | Vangelis Koukis | |
111 | 99644884 | Vangelis Koukis | Development tips |
112 | 99644884 | Vangelis Koukis | **************** |
113 | 99644884 | Vangelis Koukis | |
114 | 99644884 | Vangelis Koukis | * Running a development web server: |
115 | 99644884 | Vangelis Koukis | |
116 | 99644884 | Vangelis Koukis | .. code-block:: console |
117 | 99644884 | Vangelis Koukis | |
118 | 99644884 | Vangelis Koukis | (synnefo-env)$ snf-manage runserver |
119 | 99644884 | Vangelis Koukis | |
120 | 99644884 | Vangelis Koukis | or, if you have the django_extensions and werkzeug packages installed: |
121 | 99644884 | Vangelis Koukis | |
122 | 99644884 | Vangelis Koukis | .. code-block:: console |
123 | 99644884 | Vangelis Koukis | |
124 | 99644884 | Vangelis Koukis | (synnefo-env)$ snf-manage runserver_plus |
125 | 99644884 | Vangelis Koukis | |
126 | 99644884 | Vangelis Koukis | * Opening a python console with the synnefo environment initialized: |
127 | 99644884 | Vangelis Koukis | |
128 | 99644884 | Vangelis Koukis | .. code-block:: console |
129 | 99644884 | Vangelis Koukis | |
130 | 99644884 | Vangelis Koukis | (synnefo-env)$ snf-manage shell |
131 | 99644884 | Vangelis Koukis | |
132 | 99644884 | Vangelis Koukis | or, with the django_extensions package installed: |
133 | 99644884 | Vangelis Koukis | |
134 | 99644884 | Vangelis Koukis | .. code-block:: console |
135 | 99644884 | Vangelis Koukis | |
136 | 99644884 | Vangelis Koukis | (synnefo-env)$ snf-manage shell_plus |
137 | 99644884 | Vangelis Koukis | |
138 | 99644884 | Vangelis Koukis | |
139 | 99644884 | Vangelis Koukis | South Database Migrations |
140 | 99644884 | Vangelis Koukis | ------------------------- |
141 | 99644884 | Vangelis Koukis | |
142 | 442b6550 | Vangelis Koukis | .. _asterias-dev-initialmigration: |
143 | 99644884 | Vangelis Koukis | |
144 | 99644884 | Vangelis Koukis | Initial Migration |
145 | 99644884 | Vangelis Koukis | ***************** |
146 | 99644884 | Vangelis Koukis | |
147 | 99644884 | Vangelis Koukis | To initialize south migrations in your database the following commands must be |
148 | 99644884 | Vangelis Koukis | executed: |
149 | 99644884 | Vangelis Koukis | |
150 | 99644884 | Vangelis Koukis | .. code-block:: console |
151 | 99644884 | Vangelis Koukis | |
152 | 99644884 | Vangelis Koukis | $ snf-manage syncdb # Create / update the database with the south tables |
153 | 99644884 | Vangelis Koukis | $ snf-manage migrate # Perform migration in the database |
154 | 99644884 | Vangelis Koukis | |
155 | 99644884 | Vangelis Koukis | Note that syncdb will create the latest models that exist in the db app, so some |
156 | 99644884 | Vangelis Koukis | migrations may fail. If you are sure a migration has already taken place you |
157 | 99644884 | Vangelis Koukis | must use the ``--fake`` option, to apply it. |
158 | 99644884 | Vangelis Koukis | |
159 | 99644884 | Vangelis Koukis | For example: |
160 | 99644884 | Vangelis Koukis | |
161 | 99644884 | Vangelis Koukis | |
162 | 99644884 | Vangelis Koukis | .. code-block:: console |
163 | 99644884 | Vangelis Koukis | |
164 | 99644884 | Vangelis Koukis | $ snf-manage migrate db 0001 --fake |
165 | 99644884 | Vangelis Koukis | |
166 | 99644884 | Vangelis Koukis | To be sure that all migrations are applied use: |
167 | 99644884 | Vangelis Koukis | |
168 | 99644884 | Vangelis Koukis | .. code-block:: console |
169 | 99644884 | Vangelis Koukis | |
170 | 99644884 | Vangelis Koukis | $ snf-manage migrate db --list |
171 | 99644884 | Vangelis Koukis | |
172 | 99644884 | Vangelis Koukis | All starred migrations are applied. |
173 | 99644884 | Vangelis Koukis | |
174 | 99644884 | Vangelis Koukis | Schema migrations |
175 | 99644884 | Vangelis Koukis | ***************** |
176 | 99644884 | Vangelis Koukis | |
177 | 99644884 | Vangelis Koukis | Do not use the syncdb management command. It can only be used the first time |
178 | 99644884 | Vangelis Koukis | and/or if you drop the database and must recreate it from scratch. See |
179 | 442b6550 | Vangelis Koukis | :ref:`asterias-dev-initialmigration`. |
180 | 99644884 | Vangelis Koukis | |
181 | 99644884 | Vangelis Koukis | |
182 | 99644884 | Vangelis Koukis | Every time you make changes to the database and data migration is not required |
183 | 99644884 | Vangelis Koukis | (WARNING: always perform this with extreme care): |
184 | 99644884 | Vangelis Koukis | |
185 | 99644884 | Vangelis Koukis | .. code-block:: console |
186 | 99644884 | Vangelis Koukis | |
187 | 99644884 | Vangelis Koukis | $ snf-manage schemamigration db --auto |
188 | 99644884 | Vangelis Koukis | |
189 | 99644884 | Vangelis Koukis | The above will create the migration script. Now this must be applied to the live |
190 | 99644884 | Vangelis Koukis | database: |
191 | 99644884 | Vangelis Koukis | |
192 | 99644884 | Vangelis Koukis | .. code-block:: console |
193 | 99644884 | Vangelis Koukis | |
194 | 99644884 | Vangelis Koukis | $ snf-manage migrate db |
195 | 99644884 | Vangelis Koukis | |
196 | 99644884 | Vangelis Koukis | Consider this example (adding a field to the ``SynnefoUser`` model): |
197 | 99644884 | Vangelis Koukis | |
198 | 99644884 | Vangelis Koukis | .. code-block:: console |
199 | 99644884 | Vangelis Koukis | |
200 | 99644884 | Vangelis Koukis | $ ./bin/python manage.py schemamigration db --auto |
201 | 99644884 | Vangelis Koukis | + Added field new_south_test_field on db.SynnefoUser |
202 | 99644884 | Vangelis Koukis | |
203 | 99644884 | Vangelis Koukis | Created 0002_auto__add_field_synnefouser_new_south_test_field.py. |
204 | 99644884 | Vangelis Koukis | |
205 | 99644884 | Vangelis Koukis | You can now apply this migration with: |
206 | 99644884 | Vangelis Koukis | |
207 | 99644884 | Vangelis Koukis | .. code-block:: console |
208 | 99644884 | Vangelis Koukis | |
209 | 99644884 | Vangelis Koukis | $ ./manage.py migrate db |
210 | 99644884 | Vangelis Koukis | Running migrations for db: |
211 | 99644884 | Vangelis Koukis | - Migrating forwards to 0002_auto__add_field_synnefouser_new_south_test_field. |
212 | 99644884 | Vangelis Koukis | > db:0002_auto__add_field_synnefouser_new_south_test_field |
213 | 99644884 | Vangelis Koukis | - Loading initial data for db. |
214 | 99644884 | Vangelis Koukis | |
215 | 99644884 | Vangelis Koukis | Installing json fixture 'initial_data' from '/home/bkarak/devel/synnefo/../synnefo/db/fixtures'. |
216 | 99644884 | Vangelis Koukis | Installed 1 object(s) from 1 fixture(s) |
217 | 99644884 | Vangelis Koukis | |
218 | 99644884 | Vangelis Koukis | South needs some extra definitions to the model to preserve and migrate the |
219 | 99644884 | Vangelis Koukis | existing data, for example, if we add a field in a model, we should declare its |
220 | 99644884 | Vangelis Koukis | default value. If not, South will propably fail, after indicating the error: |
221 | 99644884 | Vangelis Koukis | |
222 | 99644884 | Vangelis Koukis | .. code-block:: console |
223 | 99644884 | Vangelis Koukis | |
224 | 99644884 | Vangelis Koukis | $ ./bin/python manage.py schemamigration db --auto |
225 | 99644884 | Vangelis Koukis | ? The field 'SynnefoUser.new_south_field_2' does not have a default specified, yet is NOT NULL. |
226 | 99644884 | Vangelis Koukis | ? Since you are adding or removing this field, you MUST specify a default |
227 | 99644884 | Vangelis Koukis | ? value to use for existing rows. Would you like to: |
228 | 99644884 | Vangelis Koukis | ? 1. Quit now, and add a default to the field in models.py |
229 | 99644884 | Vangelis Koukis | ? 2. Specify a one-off value to use for existing columns now |
230 | 99644884 | Vangelis Koukis | ? Please select a choice: 1 |
231 | 99644884 | Vangelis Koukis | |
232 | 99644884 | Vangelis Koukis | Data migrations |
233 | 99644884 | Vangelis Koukis | *************** |
234 | 99644884 | Vangelis Koukis | |
235 | 99644884 | Vangelis Koukis | To do data migration as well, for example rename a field, use the |
236 | 99644884 | Vangelis Koukis | ``datamigration`` management command. |
237 | 99644884 | Vangelis Koukis | |
238 | 99644884 | Vangelis Koukis | In contrast with ``schemamigration``, to perform complex data migration, we |
239 | 99644884 | Vangelis Koukis | must write the script manually. The process is the following: |
240 | 99644884 | Vangelis Koukis | |
241 | 99644884 | Vangelis Koukis | 1. Introduce the changes in the code and fixtures (initial data). |
242 | 99644884 | Vangelis Koukis | 2. Execute: |
243 | 99644884 | Vangelis Koukis | |
244 | 99644884 | Vangelis Koukis | .. code-block:: console |
245 | 99644884 | Vangelis Koukis | |
246 | 99644884 | Vangelis Koukis | $ snf-manage datamigration <migration_name_here> |
247 | 99644884 | Vangelis Koukis | |
248 | 99644884 | Vangelis Koukis | For example: |
249 | 99644884 | Vangelis Koukis | |
250 | 99644884 | Vangelis Koukis | .. code-block:: console |
251 | 99644884 | Vangelis Koukis | |
252 | 99644884 | Vangelis Koukis | $ ./bin/python manage.py datamigration db rename_credit_wallet |
253 | 99644884 | Vangelis Koukis | Created 0003_rename_credit_wallet.py. |
254 | 99644884 | Vangelis Koukis | |
255 | 99644884 | Vangelis Koukis | 3. Edit the generated script. It contains two methods, ``forwards`` and |
256 | 99644884 | Vangelis Koukis | ``backwards``. |
257 | 99644884 | Vangelis Koukis | |
258 | 99644884 | Vangelis Koukis | For database operations (column additions, alter tables etc), use the |
259 | 99644884 | Vangelis Koukis | South database API (http://south.aeracode.org/docs/databaseapi.html). |
260 | 99644884 | Vangelis Koukis | |
261 | 99644884 | Vangelis Koukis | To access the data, use the database reference (``orm``) provided as |
262 | 99644884 | Vangelis Koukis | parameter in ``forwards``, ``backwards`` method declarations in the |
263 | 99644884 | Vangelis Koukis | migration script. For example: |
264 | 99644884 | Vangelis Koukis | |
265 | 99644884 | Vangelis Koukis | .. code-block:: python |
266 | 99644884 | Vangelis Koukis | |
267 | 99644884 | Vangelis Koukis | class Migration(DataMigration): |
268 | 99644884 | Vangelis Koukis | |
269 | 99644884 | Vangelis Koukis | def forwards(self, orm): |
270 | 99644884 | Vangelis Koukis | orm.SynnefoUser.objects.all() |
271 | 99644884 | Vangelis Koukis | |
272 | 99644884 | Vangelis Koukis | 4. To migrate the database to the latest version, run: |
273 | 99644884 | Vangelis Koukis | |
274 | 99644884 | Vangelis Koukis | .. code-block:: console |
275 | 99644884 | Vangelis Koukis | |
276 | 99644884 | Vangelis Koukis | $ snf-manage migrate db |
277 | 99644884 | Vangelis Koukis | |
278 | 99644884 | Vangelis Koukis | To see which migrations are applied: |
279 | 99644884 | Vangelis Koukis | |
280 | 99644884 | Vangelis Koukis | .. code-block:: console |
281 | 99644884 | Vangelis Koukis | |
282 | 99644884 | Vangelis Koukis | $ snf-manage migrate db --list |
283 | 99644884 | Vangelis Koukis | |
284 | 99644884 | Vangelis Koukis | db |
285 | 99644884 | Vangelis Koukis | (*) 0001_initial |
286 | 99644884 | Vangelis Koukis | (*) 0002_auto__add_field_synnefouser_new_south_test_field |
287 | 99644884 | Vangelis Koukis | (*) 0003_rename_credit_wallet |
288 | 99644884 | Vangelis Koukis | |
289 | 99644884 | Vangelis Koukis | .. seealso:: |
290 | 442b6550 | Vangelis Koukis | More information and more thorough examples can be found in the South web site, |
291 | 99644884 | Vangelis Koukis | http://south.aeracode.org/ |
292 | 99644884 | Vangelis Koukis | |
293 | 99644884 | Vangelis Koukis | Test coverage |
294 | 99644884 | Vangelis Koukis | ------------- |
295 | 49f513ad | Vangelis Koukis | |
296 | 49f513ad | Vangelis Koukis | .. warning:: This section may be out of date. |
297 | 99644884 | Vangelis Koukis | |
298 | 99644884 | Vangelis Koukis | In order to get code coverage reports you need to install django-test-coverage |
299 | 99644884 | Vangelis Koukis | |
300 | 99644884 | Vangelis Koukis | .. code-block:: console |
301 | 99644884 | Vangelis Koukis | |
302 | 99644884 | Vangelis Koukis | $ pip install django-test-coverage |
303 | 99644884 | Vangelis Koukis | |
304 | 99644884 | Vangelis Koukis | Then configure the test runner inside Django settings: |
305 | 99644884 | Vangelis Koukis | |
306 | 99644884 | Vangelis Koukis | .. code-block:: python |
307 | 99644884 | Vangelis Koukis | |
308 | 99644884 | Vangelis Koukis | TEST_RUNNER = 'django-test-coverage.runner.run_tests' |
309 | 99644884 | Vangelis Koukis | |
310 | 99644884 | Vangelis Koukis | |
311 | 49f513ad | Vangelis Koukis | Internationalization |
312 | 49f513ad | Vangelis Koukis | -------------------- |
313 | 49f513ad | Vangelis Koukis | |
314 | 49f513ad | Vangelis Koukis | This section describes how to translate static strings in Django projects: |
315 | 49f513ad | Vangelis Koukis | |
316 | 49f513ad | Vangelis Koukis | 0. From our project's base, we add directory locale |
317 | 49f513ad | Vangelis Koukis | |
318 | 49f513ad | Vangelis Koukis | .. code-block:: console |
319 | 49f513ad | Vangelis Koukis | |
320 | 49f513ad | Vangelis Koukis | $ mkdir locale |
321 | 49f513ad | Vangelis Koukis | |
322 | 49f513ad | Vangelis Koukis | then we add on the settings.py the language code e.g., |
323 | 49f513ad | Vangelis Koukis | |
324 | 49f513ad | Vangelis Koukis | .. code-block:: python |
325 | 49f513ad | Vangelis Koukis | |
326 | 49f513ad | Vangelis Koukis | LANGUAGES = ( |
327 | 49f513ad | Vangelis Koukis | ('el', u'Greek'), |
328 | 49f513ad | Vangelis Koukis | ('en', u'English'),) |
329 | 49f513ad | Vangelis Koukis | |
330 | 49f513ad | Vangelis Koukis | 1. For each language we want to add, we run ``makemessages`` from the project's |
331 | 49f513ad | Vangelis Koukis | base: |
332 | 49f513ad | Vangelis Koukis | |
333 | 49f513ad | Vangelis Koukis | .. code-block:: python |
334 | 49f513ad | Vangelis Koukis | |
335 | 49f513ad | Vangelis Koukis | $ ./bin/django-admin.py makemessages -l el -e html,txt,py |
336 | 49f513ad | Vangelis Koukis | (./bin/django-admin.py makemessages -l el -e html,txt,py --ignore=lib/\*) |
337 | 49f513ad | Vangelis Koukis | |
338 | 49f513ad | Vangelis Koukis | This will add the Greek language, and we specify that :file:`*.html`, |
339 | 49f513ad | Vangelis Koukis | :file:`*.txt` and :file:`*.py` files contain translatable strings |
340 | 49f513ad | Vangelis Koukis | |
341 | 49f513ad | Vangelis Koukis | 2. We translate our strings: |
342 | 49f513ad | Vangelis Koukis | |
343 | 49f513ad | Vangelis Koukis | On :file:`.py` files, e.g., :file:`views.py`, first import ``gettext``: |
344 | 49f513ad | Vangelis Koukis | |
345 | 49f513ad | Vangelis Koukis | .. code-block:: python |
346 | 49f513ad | Vangelis Koukis | |
347 | 49f513ad | Vangelis Koukis | from django.utils.translation import gettext_lazy as _ |
348 | 49f513ad | Vangelis Koukis | |
349 | 49f513ad | Vangelis Koukis | Then every ``string`` to be translated becomes: ``_('string')`` |
350 | 49f513ad | Vangelis Koukis | e.g.: |
351 | 49f513ad | Vangelis Koukis | |
352 | 49f513ad | Vangelis Koukis | .. code-block:: python |
353 | 49f513ad | Vangelis Koukis | |
354 | 49f513ad | Vangelis Koukis | help_text=_("letters and numbers only")) |
355 | 49f513ad | Vangelis Koukis | 'title': _('Ubuntu 10.10 server 64bit'), |
356 | 49f513ad | Vangelis Koukis | |
357 | 49f513ad | Vangelis Koukis | On django templates (``html`` files), on the beggining of the file we add |
358 | 49f513ad | Vangelis Koukis | ``{% load i18n %}`` then rewrite every string that needs to be translated, |
359 | 49f513ad | Vangelis Koukis | as ``{% trans "string" %}``. For example: ``{% trans "Home" %}`` |
360 | 49f513ad | Vangelis Koukis | |
361 | 49f513ad | Vangelis Koukis | 3. When all strings have been translated, run: |
362 | 49f513ad | Vangelis Koukis | |
363 | 49f513ad | Vangelis Koukis | .. code-block:: console |
364 | 49f513ad | Vangelis Koukis | |
365 | 49f513ad | Vangelis Koukis | $ django-admin.py makemessages -l el -e html,txt,py |
366 | 49f513ad | Vangelis Koukis | |
367 | 49f513ad | Vangelis Koukis | processing language ``el``. This creates (or updates) the :file:`po` file |
368 | 49f513ad | Vangelis Koukis | for the Greek language. We run this command each time we add new strings to |
369 | 49f513ad | Vangelis Koukis | be translated. After that, we can translate our strings in the :file:`po` |
370 | 49f513ad | Vangelis Koukis | file (:file:`locale/el/LC_MESSAGES/django.po`) |
371 | 99644884 | Vangelis Koukis | |
372 | 49f513ad | Vangelis Koukis | 4. When the :file:`po` file is ready, run |
373 | 49f513ad | Vangelis Koukis | |
374 | 49f513ad | Vangelis Koukis | .. code-block:: console |
375 | 49f513ad | Vangelis Koukis | |
376 | 49f513ad | Vangelis Koukis | $ ./bin/django-admin.py compilemessages |
377 | 49f513ad | Vangelis Koukis | |
378 | 49f513ad | Vangelis Koukis | This compiles the ``po`` files to ``mo``. Our strings will appear translated |
379 | 49f513ad | Vangelis Koukis | once we change the language (e.g., from a dropdown menu in the page) |
380 | 49f513ad | Vangelis Koukis | |
381 | 49f513ad | Vangelis Koukis | .. seealso:: |
382 | 49f513ad | Vangelis Koukis | http://docs.djangoproject.com/en/dev/topics/i18n/internationalization/ |
383 | 49f513ad | Vangelis Koukis | |
384 | 49f513ad | Vangelis Koukis | |
385 | 49f513ad | Vangelis Koukis | Building source packages |
386 | 99644884 | Vangelis Koukis | ------------------------ |
387 | 49f513ad | Vangelis Koukis | |
388 | 49f513ad | Vangelis Koukis | .. warning:: This section may be out of date. |
389 | 99644884 | Vangelis Koukis | |
390 | 99644884 | Vangelis Koukis | To create a python package from the Synnefo source code run |
391 | 99644884 | Vangelis Koukis | |
392 | 99644884 | Vangelis Koukis | .. code-block:: bash |
393 | 99644884 | Vangelis Koukis | |
394 | 99644884 | Vangelis Koukis | $ cd snf-app |
395 | 99644884 | Vangelis Koukis | $ python setup.py sdist |
396 | 99644884 | Vangelis Koukis | |
397 | 99644884 | Vangelis Koukis | this command will create a ``tar.gz`` python source package inside ``dist`` directory. |
398 | 99644884 | Vangelis Koukis | |
399 | 99644884 | Vangelis Koukis | |
400 | 49f513ad | Vangelis Koukis | Building documentation |
401 | 49f513ad | Vangelis Koukis | ---------------------- |
402 | 99644884 | Vangelis Koukis | |
403 | 99644884 | Vangelis Koukis | Make sure you have ``sphinx`` installed. |
404 | 99644884 | Vangelis Koukis | |
405 | 99644884 | Vangelis Koukis | .. code-block:: bash |
406 | 99644884 | Vangelis Koukis | |
407 | 99644884 | Vangelis Koukis | $ cd snf-app/docs |
408 | 99644884 | Vangelis Koukis | $ make html |
409 | 99644884 | Vangelis Koukis | |
410 | 99644884 | Vangelis Koukis | .. note:: |
411 | 99644884 | Vangelis Koukis | |
412 | 99644884 | Vangelis Koukis | The theme define in the Sphinx configuration file ``conf.py`` is ``nature``, |
413 | 99644884 | Vangelis Koukis | not available in the version of Sphinx shipped with Debian Squeeze. Replace |
414 | 99644884 | Vangelis Koukis | it with ``default`` to build with a Squeeze-provided Sphinx. |
415 | 99644884 | Vangelis Koukis | |
416 | 99644884 | Vangelis Koukis | html files are generated in the ``snf-app/docs/_build/html`` directory. |
417 | 99644884 | Vangelis Koukis | |
418 | 49f513ad | Vangelis Koukis | |
419 | 49f513ad | Vangelis Koukis | Continuous integration with Jenkins |
420 | 49f513ad | Vangelis Koukis | ----------------------------------- |
421 | 49f513ad | Vangelis Koukis | .. warning:: This section may be out of date. |
422 | 49f513ad | Vangelis Koukis | |
423 | 49f513ad | Vangelis Koukis | Preparing a GIT mirror |
424 | 49f513ad | Vangelis Koukis | ********************** |
425 | 49f513ad | Vangelis Koukis | |
426 | 49f513ad | Vangelis Koukis | Jenkins cannot currently work with Git over encrypted HTTP. To solve this |
427 | 49f513ad | Vangelis Koukis | problem we currently mirror the central Git repository locally on the jenkins |
428 | 49f513ad | Vangelis Koukis | installation machine. To setup such a mirror do the following: |
429 | 49f513ad | Vangelis Koukis | |
430 | 49f513ad | Vangelis Koukis | edit .netrc:: |
431 | 49f513ad | Vangelis Koukis | |
432 | 49f513ad | Vangelis Koukis | machine code.grnet.gr |
433 | 49f513ad | Vangelis Koukis | login accountname |
434 | 49f513ad | Vangelis Koukis | password accountpasswd |
435 | 49f513ad | Vangelis Koukis | |
436 | 49f513ad | Vangelis Koukis | Create the mirror:: |
437 | 49f513ad | Vangelis Koukis | |
438 | 49f513ad | Vangelis Koukis | git clone --mirror https://code.grnet.gr/git/synnefo synnefo |
439 | 49f513ad | Vangelis Koukis | |
440 | 49f513ad | Vangelis Koukis | Setup cron to pull from the mirror periodically. Ideally, Git mirror updates |
441 | 49f513ad | Vangelis Koukis | should run just before Jenkins jobs check the mirror for changes:: |
442 | 49f513ad | Vangelis Koukis | |
443 | 49f513ad | Vangelis Koukis | 4,14,24,34,44,54 * * * * cd /path/to/mirror && git fetch && git remote prune origin |
444 | 49f513ad | Vangelis Koukis | |
445 | 49f513ad | Vangelis Koukis | Jenkins setup |
446 | 49f513ad | Vangelis Koukis | ************* |
447 | 49f513ad | Vangelis Koukis | |
448 | 49f513ad | Vangelis Koukis | The following instructions will setup Jenkins to run synnefo tests with the |
449 | 49f513ad | Vangelis Koukis | SQLite database. To run the tests on MySQL and/or Postgres, step 5 must be |
450 | 49f513ad | Vangelis Koukis | replicated. Also, the correct configuration file must be copied (line 6 of the |
451 | 49f513ad | Vangelis Koukis | build script). |
452 | 49f513ad | Vangelis Koukis | |
453 | 49f513ad | Vangelis Koukis | 1. Install and start Jenkins. On Debian Squeeze: |
454 | 49f513ad | Vangelis Koukis | |
455 | 49f513ad | Vangelis Koukis | wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | apt-key add - |
456 | 49f513ad | Vangelis Koukis | echo "deb http://pkg.jenkins-ci.org/debian binary/" >>/etc/apt/sources.list |
457 | 49f513ad | Vangelis Koukis | echo "deb http://ppa.launchpad.net/chris-lea/zeromq/ubuntu lucid main" >> /etc/apt/sources.list |
458 | 49f513ad | Vangelis Koukis | sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C7917B12 |
459 | 49f513ad | Vangelis Koukis | sudo apt-get update |
460 | 49f513ad | Vangelis Koukis | sudo apt-get install jenkins |
461 | 49f513ad | Vangelis Koukis | |
462 | 49f513ad | Vangelis Koukis | Also install the following packages: |
463 | 49f513ad | Vangelis Koukis | |
464 | 49f513ad | Vangelis Koukis | apt-get install python-virtualenv libcurl3-gnutls libcurl3-gnutls-dev |
465 | 49f513ad | Vangelis Koukis | uuid-dev libmysqlclient-dev libpq-dev libsqlite-dev |
466 | 49f513ad | Vangelis Koukis | python-dev libzmq-dev |
467 | 49f513ad | Vangelis Koukis | |
468 | 49f513ad | Vangelis Koukis | 2. After Jenkins starts, go to |
469 | 49f513ad | Vangelis Koukis | |
470 | 49f513ad | Vangelis Koukis | http://$HOST:8080/pluginManager/ |
471 | 49f513ad | Vangelis Koukis | |
472 | 49f513ad | Vangelis Koukis | and install the following plug-ins at |
473 | 49f513ad | Vangelis Koukis | |
474 | 49f513ad | Vangelis Koukis | -Jenkins Cobertura Plugin |
475 | 49f513ad | Vangelis Koukis | -Jenkins Email Extension Plugin |
476 | 49f513ad | Vangelis Koukis | -Jenkins GIT plugin |
477 | 49f513ad | Vangelis Koukis | -Jenkins SLOCCount Plug-in |
478 | 49f513ad | Vangelis Koukis | -Hudson/Jenkins Violations plugin |
479 | 49f513ad | Vangelis Koukis | |
480 | 49f513ad | Vangelis Koukis | 3. Configure the Jenkins user's Git details: |
481 | 49f513ad | Vangelis Koukis | su jenkins |
482 | 49f513ad | Vangelis Koukis | git config --global user.email "buildbot@lists.grnet.gr" |
483 | 49f513ad | Vangelis Koukis | git config --global user.name "Buildbot" |
484 | 49f513ad | Vangelis Koukis | |
485 | 49f513ad | Vangelis Koukis | 4. Make sure that all system-level dependencies specified in README.develop |
486 | 49f513ad | Vangelis Koukis | are correctly installed |
487 | 49f513ad | Vangelis Koukis | |
488 | 49f513ad | Vangelis Koukis | 5. Create a new "free-style software" job and set the following values:: |
489 | 49f513ad | Vangelis Koukis | |
490 | 49f513ad | Vangelis Koukis | Project name: synnefo |
491 | 49f513ad | Vangelis Koukis | Source Code Management: Git |
492 | 49f513ad | Vangelis Koukis | URL of repository: Jenkins Git does not support HTTPS for checking out directly |
493 | 49f513ad | Vangelis Koukis | from the repository. The temporary solution is to checkout |
494 | 49f513ad | Vangelis Koukis | with a cron script in a directory and set the checkout path |
495 | 49f513ad | Vangelis Koukis | in this field |
496 | 49f513ad | Vangelis Koukis | Branches to build: master and perhaps others |
497 | 49f513ad | Vangelis Koukis | Git->Advanced->Local subdirectory for repo (optional): synnefo |
498 | 49f513ad | Vangelis Koukis | Git->Advanced->Prune remote branches before build: check |
499 | 49f513ad | Vangelis Koukis | Repository browser: redmineweb, |
500 | 49f513ad | Vangelis Koukis | URL: https://code.grnet.gr/projects/synnefo/repository/ |
501 | 49f513ad | Vangelis Koukis | Build Triggers->Poll SCM: check |
502 | 49f513ad | Vangelis Koukis | Schedule: # every five minutes |
503 | 49f513ad | Vangelis Koukis | 0,5,10,15,20,25,30,35,40,45,50,55 * * * * |
504 | 49f513ad | Vangelis Koukis | |
505 | 49f513ad | Vangelis Koukis | Build -> Add build step-> Execute shell |
506 | 49f513ad | Vangelis Koukis | |
507 | 49f513ad | Vangelis Koukis | Command:: |
508 | 49f513ad | Vangelis Koukis | |
509 | 49f513ad | Vangelis Koukis | #!/bin/bash -ex |
510 | 49f513ad | Vangelis Koukis | cd synnefo |
511 | 49f513ad | Vangelis Koukis | mkdir -p reports |
512 | 49f513ad | Vangelis Koukis | /usr/bin/sloccount --duplicates --wide --details api util ui logic auth > reports/sloccount.sc |
513 | 49f513ad | Vangelis Koukis | cp conf/ci/manage.py . |
514 | 49f513ad | Vangelis Koukis | if [ ! -e requirements.pip ]; then cp conf/ci/pip-1.2.conf requirements.pip; fi |
515 | 49f513ad | Vangelis Koukis | cat settings.py.dist conf/ci/settings.py.sqlite > settings.py |
516 | 49f513ad | Vangelis Koukis | python manage.py update_ve |
517 | 49f513ad | Vangelis Koukis | python manage.py hudson api db logic |
518 | 49f513ad | Vangelis Koukis | |
519 | 49f513ad | Vangelis Koukis | Post-build Actions->Publish JUnit test result report: check |
520 | 49f513ad | Vangelis Koukis | Test report XMLs: synnefo/reports/TEST-*.xml |
521 | 49f513ad | Vangelis Koukis | |
522 | 49f513ad | Vangelis Koukis | Post-build Actions->Publish Cobertura Coverage Report: check |
523 | 49f513ad | Vangelis Koukis | Cobertura xml report pattern: synnefo/reports/coverage.xml |
524 | 49f513ad | Vangelis Koukis | |
525 | 49f513ad | Vangelis Koukis | Post-build Actions->Report Violations: check |
526 | 49f513ad | Vangelis Koukis | pylint[XML filename pattern]: synnefo/reports/pylint.report |
527 | 49f513ad | Vangelis Koukis | |
528 | 49f513ad | Vangelis Koukis | Post-build Actions->Publish SLOCCount analysis results |
529 | 49f513ad | Vangelis Koukis | SLOCCount reports: synnefo/reports/sloccount.sc |
530 | 49f513ad | Vangelis Koukis | (also, remember to install sloccount at /usr/bin) |
531 | 49f513ad | Vangelis Koukis | |
532 | 49f513ad | Vangelis Koukis | .. seealso:: |
533 | 49f513ad | Vangelis Koukis | http://sites.google.com/site/kmmbvnr/home/django-hudson-tutorial |