Statistics
| Branch: | Tag: | Revision:

root / README.develop @ 2b837adf

History | View | Annotate | Download (8.2 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 6fc64f55 Georgios Gousios
South Database Migrations
103 03353341 Vangelis Koukis
=========================
104 9ad94f0a Vassilios Karakoidas
105 fc2afa67 Vangelis Koukis
* Initial Migration
106 6d5f3dd2 Vassilios Karakoidas
107 fc2afa67 Vangelis Koukis
First, remember to add the south app to settings.py (it is already included in
108 fc2afa67 Vangelis Koukis
the settings.py.dist).
109 9ad94f0a Vassilios Karakoidas
110 fc2afa67 Vangelis Koukis
To initialise south migrations in your database the following commands must be
111 fc2afa67 Vangelis Koukis
executed:
112 55175e78 Vassilios Karakoidas
113 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py syncdb       # Create / update the database with the south tables
114 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py migrate db   # Perform migration in the database
115 55175e78 Vassilios Karakoidas
116 271baf11 Nikos Skalkotos
Note that syncdb will create the latest models that exist in the db app, so some
117 271baf11 Nikos Skalkotos
migrations may fail.  If you are sure a migration has already taken place you
118 271baf11 Nikos Skalkotos
must use the "--fake" option, to apply it.
119 55175e78 Vassilios Karakoidas
120 55175e78 Vassilios Karakoidas
For example:
121 55175e78 Vassilios Karakoidas
122 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py migrate db 0001 --fake
123 9ad94f0a Vassilios Karakoidas
124 55175e78 Vassilios Karakoidas
To be sure that all migrations are applied type:
125 9ad94f0a Vassilios Karakoidas
126 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py migrate db --list
127 55175e78 Vassilios Karakoidas
128 55175e78 Vassilios Karakoidas
All starred migrations are applied.
129 55175e78 Vassilios Karakoidas
130 fc2afa67 Vangelis Koukis
Remember, the migration is performed mainly for the data, not for the database
131 271baf11 Nikos Skalkotos
schema. If you do not want to migrate the data, a syncdb and fake migrations for
132 271baf11 Nikos Skalkotos
all the migration versions will suffice.
133 55175e78 Vassilios Karakoidas
134 fc2afa67 Vangelis Koukis
* Schema migrations:
135 55175e78 Vassilios Karakoidas
136 271baf11 Nikos Skalkotos
Do not use the syncdb management command. It can only be used the first time
137 271baf11 Nikos Skalkotos
and/or if you drop the database and must recreate it from scratch. See
138 271baf11 Nikos Skalkotos
"Initial Migration" section.
139 9ad94f0a Vassilios Karakoidas
140 fc2afa67 Vangelis Koukis
Every time you make changes to the database and data migration is not required
141 fc2afa67 Vangelis Koukis
(WARNING: always perform this with extreme care):
142 9ad94f0a Vassilios Karakoidas
143 1ef8ecd4 Constantinos Venetsanopoulos
    $ ./bin/python manage.py schemamigration db --auto
144 9ad94f0a Vassilios Karakoidas
145 271baf11 Nikos Skalkotos
The above will create the migration script. Now this must be applied to the live
146 271baf11 Nikos Skalkotos
database.
147 9ad94f0a Vassilios Karakoidas
148 9ad94f0a Vassilios Karakoidas
    $ ./bin/python migrate db
149 9ad94f0a Vassilios Karakoidas
150 9ad94f0a Vassilios Karakoidas
Consider this example (adding a field to the SynnefoUser model):
151 9ad94f0a Vassilios Karakoidas
152 271baf11 Nikos Skalkotos
    $ ./bin/python manage.py schemamigration db --auto
153 9ad94f0a Vassilios Karakoidas
     + Added field new_south_test_field on db.SynnefoUser
154 6fc64f55 Georgios Gousios
     Created 0002_auto__add_field_synnefouser_new_south_test_field.py.
155 6fc64f55 Georgios Gousios
156 6fc64f55 Georgios Gousios
  You can now apply this migration with: ./manage.py migrate db
157 6fc64f55 Georgios Gousios
158 d79d8208 Vassilios Karakoidas
    $ ./manage.py migrate db
159 9ad94f0a Vassilios Karakoidas
     Running migrations for db:
160 9ad94f0a Vassilios Karakoidas
     - Migrating forwards to 0002_auto__add_field_synnefouser_new_south_test_field.
161 9ad94f0a Vassilios Karakoidas
     > db:0002_auto__add_field_synnefouser_new_south_test_field
162 9ad94f0a Vassilios Karakoidas
     - Loading initial data for db.
163 9ad94f0a Vassilios Karakoidas
    Installing json fixture 'initial_data' from '/home/bkarak/devel/synnefo/../synnefo/db/fixtures'.
164 9ad94f0a Vassilios Karakoidas
    Installed 1 object(s) from 1 fixture(s)
165 9ad94f0a Vassilios Karakoidas
166 fc2afa67 Vangelis Koukis
South needs some extra definitions to the model to preserve and migrate the
167 fc2afa67 Vangelis Koukis
existing data, for example, if we add a field in a model, we should declare its
168 fc2afa67 Vangelis Koukis
default value. If not, South will propably fail, after indicating the error.
169 6fc64f55 Georgios Gousios
170 d79d8208 Vassilios Karakoidas
    $ ./bin/python manage.py schemamigration db --auto
171 d79d8208 Vassilios Karakoidas
     ? The field 'SynnefoUser.new_south_field_2' does not have a default specified, yet is NOT NULL.
172 d79d8208 Vassilios Karakoidas
     ? Since you are adding or removing this field, you MUST specify a default
173 d79d8208 Vassilios Karakoidas
     ? value to use for existing rows. Would you like to:
174 d79d8208 Vassilios Karakoidas
     ?  1. Quit now, and add a default to the field in models.py
175 d79d8208 Vassilios Karakoidas
     ?  2. Specify a one-off value to use for existing columns now
176 d79d8208 Vassilios Karakoidas
     ? Please select a choice: 1
177 6fc64f55 Georgios Gousios
178 fc2afa67 Vangelis Koukis
* Data migrations:
179 9ad94f0a Vassilios Karakoidas
180 271baf11 Nikos Skalkotos
If we need to do data migration as well, for example rename a field, we use the
181 fc2afa67 Vangelis Koukis
'datamigration' management command.
182 9ad94f0a Vassilios Karakoidas
183 fc2afa67 Vangelis Koukis
In contrast with schemamigration, to perform complex data migration, we must
184 fc2afa67 Vangelis Koukis
write the script manually. The process is the following:
185 2e19b161 Vassilios Karakoidas
186 2e19b161 Vassilios Karakoidas
    1. Introduce the changes in the code and fixtures (initial data).
187 2e19b161 Vassilios Karakoidas
    2. Execute:
188 2e19b161 Vassilios Karakoidas
189 2e19b161 Vassilios Karakoidas
    $ ./bin/python manage.py datamigration <migration_name_here>
190 2e19b161 Vassilios Karakoidas
191 2e19b161 Vassilios Karakoidas
    For example:
192 2e19b161 Vassilios Karakoidas
193 2e19b161 Vassilios Karakoidas
    $ ./bin/python manage.py datamigration db rename_credit_wallet
194 2e19b161 Vassilios Karakoidas
    Created 0003_rename_credit_wallet.py.
195 2e19b161 Vassilios Karakoidas
196 fc2afa67 Vangelis Koukis
    3. We edit the generated script. It contains two methods: forwards and
197 fc2afa67 Vangelis Koukis
    backwards.
198 2e19b161 Vassilios Karakoidas
199 fc2afa67 Vangelis Koukis
    For database operations (column additions, alter tables etc) we use the
200 fc2afa67 Vangelis Koukis
    South database API (http://south.aeracode.org/docs/databaseapi.html).
201 2e19b161 Vassilios Karakoidas
202 fc2afa67 Vangelis Koukis
    To access the data, we use the database reference (orm) provided as
203 fc2afa67 Vangelis Koukis
    parameter in forwards, backwards method declarations in the migration
204 fc2afa67 Vangelis Koukis
    script. For example:
205 2e19b161 Vassilios Karakoidas
206 2e19b161 Vassilios Karakoidas
    class Migration(DataMigration):
207 2e19b161 Vassilios Karakoidas
208 2e19b161 Vassilios Karakoidas
    def forwards(self, orm):
209 2e19b161 Vassilios Karakoidas
        orm.SynnefoUser.objects.all()
210 2e19b161 Vassilios Karakoidas
211 2e19b161 Vassilios Karakoidas
    4. To migrate the database to the latest version, we execute:
212 2e19b161 Vassilios Karakoidas
213 2e19b161 Vassilios Karakoidas
    ./manage.py migrate db
214 2e19b161 Vassilios Karakoidas
215 2e19b161 Vassilios Karakoidas
To see which migrations are applied:
216 2e19b161 Vassilios Karakoidas
217 2e19b161 Vassilios Karakoidas
    $ ./bin/python manage.py migrate db --list
218 2e19b161 Vassilios Karakoidas
219 2e19b161 Vassilios Karakoidas
      db
220 2e19b161 Vassilios Karakoidas
        (*) 0001_initial
221 2e19b161 Vassilios Karakoidas
        (*) 0002_auto__add_field_synnefouser_new_south_test_field
222 2e19b161 Vassilios Karakoidas
        (*) 0003_rename_credit_wallet
223 2e19b161 Vassilios Karakoidas
224 2e19b161 Vassilios Karakoidas
More information and more thorough examples can be found in the South web site.
225 2e19b161 Vassilios Karakoidas
226 2e19b161 Vassilios Karakoidas
http://south.aeracode.org/
227 2e19b161 Vassilios Karakoidas
228 fc2afa67 Vangelis Koukis
229 bbd4f788 Georgios Gousios
UI Testing
230 03353341 Vangelis Koukis
==========
231 03353341 Vangelis Koukis
The functional ui tests require the Selenium server and the synnefo app to
232 83d51c7b Georgios Gousios
be running.
233 bbd4f788 Georgios Gousios
234 bbd4f788 Georgios Gousios
    $ wget http://selenium.googlecode.com/files/selenium-server-standalone-2.0b2.jar
235 bbd4f788 Georgios Gousios
    $ java -jar selenium-server-standalone-2.0b2.jar &
236 bbd4f788 Georgios Gousios
    $ ./bin/python manage.py runserver &
237 bbd4f788 Georgios Gousios
    $ ./bin/python manage.py test ui
238 bbd4f788 Georgios Gousios
239 fc2afa67 Vangelis Koukis
240 bbd4f788 Georgios Gousios
Test coverage
241 03353341 Vangelis Koukis
=============
242 bbd4f788 Georgios Gousios
243 bbd4f788 Georgios Gousios
In order to get code coverage reports you need to install django-test-coverage
244 03353341 Vangelis Koukis
245 bbd4f788 Georgios Gousios
   $ ./bin/pip install django-test-coverage
246 bbd4f788 Georgios Gousios
247 bbd4f788 Georgios Gousios
Then edit your settings.py and configure the test runner:
248 bbd4f788 Georgios Gousios
249 bbd4f788 Georgios Gousios
   TEST_RUNNER = 'django-test-coverage.runner.run_tests'