Statistics
| Branch: | Tag: | Revision:

root / docs / cyclades-dev.guide.rst @ 81243c3d

History | View | Annotate | Download (16.6 kB)

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