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' |