Statistics
| Branch: | Tag: | Revision:

root / README.develop @ bcb81dc8

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 03353341 Vangelis Koukis
   contained in settings.py.dist. MAKE SURE to call fix_amqp_settings()
34 03353341 Vangelis Koukis
   after settings a custom BACKEND_PREFIX_ID.
35 03353341 Vangelis Koukis
36 03353341 Vangelis Koukis
37 03353341 Vangelis Koukis
3. For development purposes, Django's own development server, ./manage.py runserver
38 03353341 Vangelis Koukis
   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 03353341 Vangelis Koukis
   username. Make sure you call fix_amqp_settings() to setup use of
61 03353341 Vangelis Koukis
   individual 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 03353341 Vangelis Koukis
   backend. You *cannot* run your own, unless you install your own Ganeti backend,
77 03353341 Vangelis Koukis
   because it needs direct access to the hypervisor's VNC port on GANETI-NODEs.
78 03353341 Vangelis Koukis
79 03353341 Vangelis Koukis
80 03353341 Vangelis Koukis
13.The development Ganeti backend already has a number of OS Images available.
81 03353341 Vangelis Koukis
82 03353341 Vangelis Koukis
83 03353341 Vangelis Koukis
14.The development Ganeti backend already has a number of pre-provisioned bridges
84 03353341 Vangelis Koukis
   available, per each BACKEND_PREFIX_ID.
85 03353341 Vangelis Koukis
86 03353341 Vangelis Koukis
   To setup simple NAT-based networking on a Ganeti backend on your own,
87 03353341 Vangelis Koukis
   please see the provided patches under contrib/patches/.
88 03353341 Vangelis Koukis
   You will need minor patches to the sample KVM ifup hook, kvm-vif-bridge,
89 03353341 Vangelis Koukis
   and a small patch to NFDHCPD to enable it to work with bridged tap+ interfaces.
90 03353341 Vangelis Koukis
   To support bridged tap interfaces you also need to patch the python-nfqueue
91 03353341 Vangelis Koukis
   package, patches against python-nfqueue-0.3 [part of Debian Sid] are also
92 03353341 Vangelis Koukis
   provided under contrib/patches/.
93 03353341 Vangelis Koukis
94 03353341 Vangelis Koukis
95 03353341 Vangelis Koukis
15.As is.
96 03353341 Vangelis Koukis
97 03353341 Vangelis Koukis
98 03353341 Vangelis Koukis
16.As is.
99 bbd4f788 Georgios Gousios
100 fc2afa67 Vangelis Koukis
101 6fc64f55 Georgios Gousios
South Database Migrations
102 03353341 Vangelis Koukis
=========================
103 9ad94f0a Vassilios Karakoidas
104 fc2afa67 Vangelis Koukis
* Initial Migration
105 6d5f3dd2 Vassilios Karakoidas
106 fc2afa67 Vangelis Koukis
First, remember to add the south app to settings.py (it is already included in
107 fc2afa67 Vangelis Koukis
the settings.py.dist).
108 9ad94f0a Vassilios Karakoidas
109 fc2afa67 Vangelis Koukis
To initialise south migrations in your database the following commands must be
110 fc2afa67 Vangelis Koukis
executed:
111 55175e78 Vassilios Karakoidas
112 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py syncdb       # Create / update the database with the south tables
113 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py migrate db   # Perform migration in the database
114 55175e78 Vassilios Karakoidas
115 fc2afa67 Vangelis Koukis
Note that syncdb will create the latest models that exist in the db app, so
116 fc2afa67 Vangelis Koukis
some migrations may fail.  If you are sure a migration has already taken place
117 fc2afa67 Vangelis Koukis
you must use the "--fake" option, to apply it.
118 55175e78 Vassilios Karakoidas
119 55175e78 Vassilios Karakoidas
For example:
120 55175e78 Vassilios Karakoidas
121 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py migrate db 0001 --fake
122 9ad94f0a Vassilios Karakoidas
123 55175e78 Vassilios Karakoidas
To be sure that all migrations are applied type:
124 9ad94f0a Vassilios Karakoidas
125 55175e78 Vassilios Karakoidas
    $ ./bin/python manage.py migrate db --list
126 55175e78 Vassilios Karakoidas
127 55175e78 Vassilios Karakoidas
All starred migrations are applied.
128 55175e78 Vassilios Karakoidas
129 fc2afa67 Vangelis Koukis
Remember, the migration is performed mainly for the data, not for the database
130 fc2afa67 Vangelis Koukis
schema. If you do not want to migrate the data, a syncdb and fake migrations
131 fc2afa67 Vangelis Koukis
for all the migration versions will suffice.
132 55175e78 Vassilios Karakoidas
133 fc2afa67 Vangelis Koukis
* Schema migrations:
134 55175e78 Vassilios Karakoidas
135 55175e78 Vassilios Karakoidas
Do not use the syncdb management command. It can only be used
136 fc2afa67 Vangelis Koukis
the first time and/or if you drop the database and must recreate it from
137 fc2afa67 Vangelis Koukis
scratch.
138 55175e78 Vassilios Karakoidas
See "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 fc2afa67 Vangelis Koukis
The above will create the migration script. Now this must be applied to the
146 fc2afa67 Vangelis Koukis
live 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 9ad94f0a Vassilios Karakoidas
    bkarak@nefarian:~/devel/synnefo$ ./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 fc2afa67 Vangelis Koukis
If we need to do data migration as well, for example rename a field, we use tha
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'