Statistics
| Branch: | Tag: | Revision:

root / README.develop @ c0f6fb49

History | View | Annotate | Download (8.3 kB)

1 03353341 Vangelis Koukis
DEVELOP.txt - Information on how to setup a development environment.
2 bbd4f788 Georgios Gousios
3 03353341 Vangelis Koukis
This file documents the installation of a development environment for Synnefo.
4 03353341 Vangelis Koukis
It should be read alongside README.deploy.
5 bbd4f788 Georgios Gousios
6 03353341 Vangelis Koukis
It contains development-specific ammendments to the basic deployment steps
7 03353341 Vangelis Koukis
outlined in README.deploy, and development-specific notes.
8 c807557e Vangelis Koukis
9 bbd4f788 Georgios Gousios
10 03353341 Vangelis Koukis
Installing the development environment
11 03353341 Vangelis Koukis
======================================
12 bbd4f788 Georgios Gousios
13 03353341 Vangelis Koukis
For a basic development environment you need to follow steps 0-15
14 03353341 Vangelis Koukis
of README.deploy, which should be read in its entirety *before* this document.
15 bbd4f788 Georgios Gousios
16 03353341 Vangelis Koukis
Development-specific guidelines on each step:
17 bbd4f788 Georgios Gousios
18 bbd4f788 Georgios Gousios
19 03353341 Vangelis Koukis
0. Allocation of physical nodes:
20 03353341 Vangelis Koukis
   Node types DB, APISERVER, LOGIC may all be run on the same physical machine,
21 03353341 Vangelis Koukis
   usually, your development workstation.
22 bbd4f788 Georgios Gousios
23 03353341 Vangelis Koukis
   Nodes of type GANETI-MASTER, GANETI-NODES and QUEUE are already provided
24 03353341 Vangelis Koukis
   by the development Ganeti backend. Access credentials are provided in
25 03353341 Vangelis Koukis
   settings.py.dist.
26 bbd4f788 Georgios Gousios
27 bbd4f788 Georgios Gousios
28 03353341 Vangelis Koukis
1. You do not need to install your own Ganeti installation.
29 03353341 Vangelis Koukis
   Use the RAPI endpoint as contained in settings.py.dist.
30 03353341 Vangelis Koukis
31 03353341 Vangelis Koukis
32 03353341 Vangelis Koukis
2. You do not need to setup your own RabbitMQ nodes, use the AMQP endpoints
33 271baf11 Nikos Skalkotos
   contained in settings.py.dist. MAKE SURE to call fix_amqp_settings() after
34 271baf11 Nikos Skalkotos
   settings a custom BACKEND_PREFIX_ID.
35 03353341 Vangelis Koukis
36 03353341 Vangelis Koukis
37 271baf11 Nikos Skalkotos
3. For development purposes, Django's own development
38 271baf11 Nikos Skalkotos
   `server, ./manage.py runserver' will suffice.
39 03353341 Vangelis Koukis
40 03353341 Vangelis Koukis
41 03353341 Vangelis Koukis
4. Use a virtual environment to install the Django project, or packages provided
42 03353341 Vangelis Koukis
   by your distribution.
43 03353341 Vangelis Koukis
44 03353341 Vangelis Koukis
45 03353341 Vangelis Koukis
5. Install a DB of your own, or use the PostgreSQL instance available on the
46 03353341 Vangelis Koukis
   development backend.
47 03353341 Vangelis Koukis
48 03353341 Vangelis Koukis
49 03353341 Vangelis Koukis
6. As is.
50 03353341 Vangelis Koukis
51 03353341 Vangelis Koukis
52 03353341 Vangelis Koukis
7. The following fixtures can be loaded optionally depending on
53 03353341 Vangelis Koukis
   testing/development requirements, and are not needed in a production setup:
54 f5e590e4 Georgios Gousios
55 bbd4f788 Georgios Gousios
	$ ./bin/python manage.py loaddata db/fixtures/vms.json
56 f5e590e4 Georgios Gousios
	$ ./bin/python manage.py loaddata db/fixtures/disks.json
57 83d51c7b Georgios Gousios
58 83d51c7b Georgios Gousios
59 03353341 Vangelis Koukis
8. MAKE SURE you setup a distinct BACKEND_PREFIX_ID, e.g., use your commit
60 271baf11 Nikos Skalkotos
   username. Make sure you call fix_amqp_settings() to setup use of individual
61 271baf11 Nikos Skalkotos
   queues on RabbiMQ.
62 03353341 Vangelis Koukis
63 03353341 Vangelis Koukis
64 03353341 Vangelis Koukis
9. The Ganeti monitoring daemon from the latest Synnefo release is already
65 03353341 Vangelis Koukis
   running on the development Ganeti master. You may also run your own, on your
66 03353341 Vangelis Koukis
   own Ganeti backend if you so wish.
67 24435a56 Georgios Gousios
68 f5e590e4 Georgios Gousios
69 03353341 Vangelis Koukis
10.As is.
70 03353341 Vangelis Koukis
71 03353341 Vangelis Koukis
11.The Synnefo Ganeti hook is already running on the development backend,
72 03353341 Vangelis Koukis
   sending notifications over AMQP.
73 03353341 Vangelis Koukis
74 03353341 Vangelis Koukis
75 03353341 Vangelis Koukis
12.The VNC authentication proxy is already running on the Ganeti development
76 271baf11 Nikos Skalkotos
   backend. You *cannot* run your own, unless you install your own Ganeti
77 271baf11 Nikos Skalkotos
   backend, because it needs direct access to the hypervisor's VNC port on
78 271baf11 Nikos Skalkotos
   GANETI-NODEs.
79 03353341 Vangelis Koukis
80 03353341 Vangelis Koukis
81 03353341 Vangelis Koukis
13.The development Ganeti backend already has a number of OS Images available.
82 03353341 Vangelis Koukis
83 03353341 Vangelis Koukis
84 271baf11 Nikos Skalkotos
14.The development Ganeti backend already has a number of pre-provisioned
85 271baf11 Nikos Skalkotos
   bridges available, per each BACKEND_PREFIX_ID.
86 03353341 Vangelis Koukis
87 03353341 Vangelis Koukis
   To setup simple NAT-based networking on a Ganeti backend on your own,
88 03353341 Vangelis Koukis
   please see the provided patches under contrib/patches/.
89 03353341 Vangelis Koukis
   You will need minor patches to the sample KVM ifup hook, kvm-vif-bridge,
90 271baf11 Nikos Skalkotos
   and a small patch to NFDHCPD to enable it to work with bridged tap+
91 271baf11 Nikos Skalkotos
   interfaces. To support bridged tap interfaces you also need to patch the
92 271baf11 Nikos Skalkotos
   python-nfqueue package, patches against python-nfqueue-0.3 [part of Debian
93 271baf11 Nikos Skalkotos
   Sid] are also provided under contrib/patches/.
94 03353341 Vangelis Koukis
95 03353341 Vangelis Koukis
96 03353341 Vangelis Koukis
15.As is.
97 03353341 Vangelis Koukis
98 03353341 Vangelis Koukis
99 03353341 Vangelis Koukis
16.As is.
100 bbd4f788 Georgios Gousios
101 fc2afa67 Vangelis Koukis
102 61868190 Vangelis Koukis
17.[OPTIONAL] Create settings.d/99-local.conf and insert local overrides for
103 61868190 Vangelis Koukis
   settings.d/*.  This will allow pulling new files without needing to reapply
104 61868190 Vangelis Koukis
   local any local modifications.
105 61868190 Vangelis Koukis
106 61868190 Vangelis Koukis
107 6fc64f55 Georgios Gousios
South Database Migrations
108 03353341 Vangelis Koukis
=========================
109 9ad94f0a Vassilios Karakoidas
110 fc2afa67 Vangelis Koukis
* Initial Migration
111 6d5f3dd2 Vassilios Karakoidas
112 fc2afa67 Vangelis Koukis
First, remember to add the south app to settings.py (it is already included in
113 fc2afa67 Vangelis Koukis
the settings.py.dist).
114 9ad94f0a Vassilios Karakoidas
115 fc2afa67 Vangelis Koukis
To initialise south migrations in your database the following commands must be
116 fc2afa67 Vangelis Koukis
executed:
117 55175e78 Vassilios Karakoidas
118 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py syncdb       # Create / update the database with the south tables
119 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py migrate db   # Perform migration in the database
120 55175e78 Vassilios Karakoidas
121 271baf11 Nikos Skalkotos
Note that syncdb will create the latest models that exist in the db app, so some
122 271baf11 Nikos Skalkotos
migrations may fail.  If you are sure a migration has already taken place you
123 271baf11 Nikos Skalkotos
must use the "--fake" option, to apply it.
124 55175e78 Vassilios Karakoidas
125 55175e78 Vassilios Karakoidas
For example:
126 55175e78 Vassilios Karakoidas
127 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py migrate db 0001 --fake
128 9ad94f0a Vassilios Karakoidas
129 55175e78 Vassilios Karakoidas
To be sure that all migrations are applied type:
130 9ad94f0a Vassilios Karakoidas
131 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py migrate db --list
132 55175e78 Vassilios Karakoidas
133 55175e78 Vassilios Karakoidas
All starred migrations are applied.
134 55175e78 Vassilios Karakoidas
135 fc2afa67 Vangelis Koukis
Remember, the migration is performed mainly for the data, not for the database
136 271baf11 Nikos Skalkotos
schema. If you do not want to migrate the data, a syncdb and fake migrations for
137 271baf11 Nikos Skalkotos
all the migration versions will suffice.
138 55175e78 Vassilios Karakoidas
139 fc2afa67 Vangelis Koukis
* Schema migrations:
140 55175e78 Vassilios Karakoidas
141 271baf11 Nikos Skalkotos
Do not use the syncdb management command. It can only be used the first time
142 271baf11 Nikos Skalkotos
and/or if you drop the database and must recreate it from scratch. See
143 271baf11 Nikos Skalkotos
"Initial Migration" section.
144 9ad94f0a Vassilios Karakoidas
145 fc2afa67 Vangelis Koukis
Every time you make changes to the database and data migration is not required
146 fc2afa67 Vangelis Koukis
(WARNING: always perform this with extreme care):
147 9ad94f0a Vassilios Karakoidas
148 1ef8ecd4 Constantinos Venetsanopoulos
    $ ./bin/python manage.py schemamigration db --auto
149 9ad94f0a Vassilios Karakoidas
150 271baf11 Nikos Skalkotos
The above will create the migration script. Now this must be applied to the live
151 271baf11 Nikos Skalkotos
database.
152 9ad94f0a Vassilios Karakoidas
153 9ad94f0a Vassilios Karakoidas
    $ ./bin/python migrate db
154 9ad94f0a Vassilios Karakoidas
155 9ad94f0a Vassilios Karakoidas
Consider this example (adding a field to the SynnefoUser model):
156 9ad94f0a Vassilios Karakoidas
157 271baf11 Nikos Skalkotos
    $ ./bin/python manage.py schemamigration db --auto
158 9ad94f0a Vassilios Karakoidas
     + Added field new_south_test_field on db.SynnefoUser
159 6fc64f55 Georgios Gousios
     Created 0002_auto__add_field_synnefouser_new_south_test_field.py.
160 6fc64f55 Georgios Gousios
161 6fc64f55 Georgios Gousios
  You can now apply this migration with: ./manage.py migrate db
162 6fc64f55 Georgios Gousios
163 d79d8208 Vassilios Karakoidas
    $ ./manage.py migrate db
164 9ad94f0a Vassilios Karakoidas
     Running migrations for db:
165 9ad94f0a Vassilios Karakoidas
     - Migrating forwards to 0002_auto__add_field_synnefouser_new_south_test_field.
166 9ad94f0a Vassilios Karakoidas
     > db:0002_auto__add_field_synnefouser_new_south_test_field
167 9ad94f0a Vassilios Karakoidas
     - Loading initial data for db.
168 9ad94f0a Vassilios Karakoidas
    Installing json fixture 'initial_data' from '/home/bkarak/devel/synnefo/../synnefo/db/fixtures'.
169 9ad94f0a Vassilios Karakoidas
    Installed 1 object(s) from 1 fixture(s)
170 9ad94f0a Vassilios Karakoidas
171 fc2afa67 Vangelis Koukis
South needs some extra definitions to the model to preserve and migrate the
172 fc2afa67 Vangelis Koukis
existing data, for example, if we add a field in a model, we should declare its
173 fc2afa67 Vangelis Koukis
default value. If not, South will propably fail, after indicating the error.
174 6fc64f55 Georgios Gousios
175 d79d8208 Vassilios Karakoidas
    $ ./bin/python manage.py schemamigration db --auto
176 d79d8208 Vassilios Karakoidas
     ? The field 'SynnefoUser.new_south_field_2' does not have a default specified, yet is NOT NULL.
177 d79d8208 Vassilios Karakoidas
     ? Since you are adding or removing this field, you MUST specify a default
178 d79d8208 Vassilios Karakoidas
     ? value to use for existing rows. Would you like to:
179 d79d8208 Vassilios Karakoidas
     ?  1. Quit now, and add a default to the field in models.py
180 d79d8208 Vassilios Karakoidas
     ?  2. Specify a one-off value to use for existing columns now
181 d79d8208 Vassilios Karakoidas
     ? Please select a choice: 1
182 6fc64f55 Georgios Gousios
183 fc2afa67 Vangelis Koukis
* Data migrations:
184 9ad94f0a Vassilios Karakoidas
185 271baf11 Nikos Skalkotos
If we need to do data migration as well, for example rename a field, we use the
186 fc2afa67 Vangelis Koukis
'datamigration' management command.
187 9ad94f0a Vassilios Karakoidas
188 fc2afa67 Vangelis Koukis
In contrast with schemamigration, to perform complex data migration, we must
189 fc2afa67 Vangelis Koukis
write the script manually. The process is the following:
190 2e19b161 Vassilios Karakoidas
191 2e19b161 Vassilios Karakoidas
    1. Introduce the changes in the code and fixtures (initial data).
192 2e19b161 Vassilios Karakoidas
    2. Execute:
193 2e19b161 Vassilios Karakoidas
194 2e19b161 Vassilios Karakoidas
    $ ./bin/python manage.py datamigration <migration_name_here>
195 2e19b161 Vassilios Karakoidas
196 2e19b161 Vassilios Karakoidas
    For example:
197 2e19b161 Vassilios Karakoidas
198 2e19b161 Vassilios Karakoidas
    $ ./bin/python manage.py datamigration db rename_credit_wallet
199 2e19b161 Vassilios Karakoidas
    Created 0003_rename_credit_wallet.py.
200 2e19b161 Vassilios Karakoidas
201 fc2afa67 Vangelis Koukis
    3. We edit the generated script. It contains two methods: forwards and
202 fc2afa67 Vangelis Koukis
    backwards.
203 2e19b161 Vassilios Karakoidas
204 fc2afa67 Vangelis Koukis
    For database operations (column additions, alter tables etc) we use the
205 fc2afa67 Vangelis Koukis
    South database API (http://south.aeracode.org/docs/databaseapi.html).
206 2e19b161 Vassilios Karakoidas
207 fc2afa67 Vangelis Koukis
    To access the data, we use the database reference (orm) provided as
208 fc2afa67 Vangelis Koukis
    parameter in forwards, backwards method declarations in the migration
209 fc2afa67 Vangelis Koukis
    script. For example:
210 2e19b161 Vassilios Karakoidas
211 2e19b161 Vassilios Karakoidas
    class Migration(DataMigration):
212 2e19b161 Vassilios Karakoidas
213 2e19b161 Vassilios Karakoidas
    def forwards(self, orm):
214 2e19b161 Vassilios Karakoidas
        orm.SynnefoUser.objects.all()
215 2e19b161 Vassilios Karakoidas
216 2e19b161 Vassilios Karakoidas
    4. To migrate the database to the latest version, we execute:
217 2e19b161 Vassilios Karakoidas
218 2e19b161 Vassilios Karakoidas
    ./manage.py migrate db
219 2e19b161 Vassilios Karakoidas
220 2e19b161 Vassilios Karakoidas
To see which migrations are applied:
221 2e19b161 Vassilios Karakoidas
222 2e19b161 Vassilios Karakoidas
    $ ./bin/python manage.py migrate db --list
223 2e19b161 Vassilios Karakoidas
224 2e19b161 Vassilios Karakoidas
      db
225 2e19b161 Vassilios Karakoidas
        (*) 0001_initial
226 2e19b161 Vassilios Karakoidas
        (*) 0002_auto__add_field_synnefouser_new_south_test_field
227 2e19b161 Vassilios Karakoidas
        (*) 0003_rename_credit_wallet
228 2e19b161 Vassilios Karakoidas
229 2e19b161 Vassilios Karakoidas
More information and more thorough examples can be found in the South web site.
230 2e19b161 Vassilios Karakoidas
231 2e19b161 Vassilios Karakoidas
http://south.aeracode.org/
232 2e19b161 Vassilios Karakoidas
233 fc2afa67 Vangelis Koukis
234 bbd4f788 Georgios Gousios
UI Testing
235 03353341 Vangelis Koukis
==========
236 03353341 Vangelis Koukis
The functional ui tests require the Selenium server and the synnefo app to
237 83d51c7b Georgios Gousios
be running.
238 bbd4f788 Georgios Gousios
239 bbd4f788 Georgios Gousios
    $ wget http://selenium.googlecode.com/files/selenium-server-standalone-2.0b2.jar
240 bbd4f788 Georgios Gousios
    $ java -jar selenium-server-standalone-2.0b2.jar &
241 bbd4f788 Georgios Gousios
    $ ./bin/python manage.py runserver &
242 bbd4f788 Georgios Gousios
    $ ./bin/python manage.py test ui
243 bbd4f788 Georgios Gousios
244 fc2afa67 Vangelis Koukis
245 bbd4f788 Georgios Gousios
Test coverage
246 03353341 Vangelis Koukis
=============
247 bbd4f788 Georgios Gousios
248 bbd4f788 Georgios Gousios
In order to get code coverage reports you need to install django-test-coverage
249 03353341 Vangelis Koukis
250 bbd4f788 Georgios Gousios
   $ ./bin/pip install django-test-coverage
251 bbd4f788 Georgios Gousios
252 bbd4f788 Georgios Gousios
Then edit your settings.py and configure the test runner:
253 bbd4f788 Georgios Gousios
254 bbd4f788 Georgios Gousios
   TEST_RUNNER = 'django-test-coverage.runner.run_tests'