Statistics
| Branch: | Tag: | Revision:

root / docs / quick-install-intgrt-guide.rst @ 73ebcd68

History | View | Annotate | Download (17.4 kB)

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