Statistics
| Branch: | Tag: | Revision:

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