Statistics
| Branch: | Tag: | Revision:

root / README.develop @ 404ccab2

History | View | Annotate | Download (8.5 kB)

1
DEVELOP.txt - Information on how to setup a development environment.
2

    
3
This file documents the installation of a development environment for Synnefo.
4
It should be read alongside README.deploy.
5

    
6
It contains development-specific ammendments to the basic deployment steps
7
outlined in README.deploy, and development-specific notes.
8

    
9

    
10
Installing the development environment
11
======================================
12

    
13
For a basic development environment you need to follow steps 0-15
14
of README.deploy, which should be read in its entirety *before* this document.
15

    
16
Development-specific guidelines on each step:
17

    
18

    
19
0. Allocation of physical nodes:
20
   Node types DB, APISERVER, LOGIC may all be run on the same physical machine,
21
   usually, your development workstation.
22

    
23
   Nodes of type GANETI-MASTER, GANETI-NODES and QUEUE are already provided
24
   by the development Ganeti backend. Access credentials are provided in
25
   settings.py.dist.
26

    
27

    
28
1. You do not need to install your own Ganeti installation.
29
   Use the RAPI endpoint as contained in settings.py.dist.
30

    
31

    
32
2. You do not need to setup your own RabbitMQ nodes, use the AMQP endpoints
33
   contained in settings.py.dist. MAKE SURE to call fix_amqp_settings() after
34
   settings a custom BACKEND_PREFIX_ID.
35

    
36

    
37
3. For development purposes, Django's own development
38
   `server, ./manage.py runserver' will suffice.
39

    
40

    
41
4. Use a virtual environment to install the Django project, or packages provided
42
   by your distribution.
43

    
44

    
45
5. Install a DB of your own, or use the PostgreSQL instance available on the
46
   development backend.
47

    
48

    
49
6. As is.
50

    
51

    
52
7. The following fixtures can be loaded optionally depending on
53
   testing/development requirements, and are not needed in a production setup:
54

    
55
	$ ./bin/python manage.py loaddata db/fixtures/vms.json
56
	$ ./bin/python manage.py loaddata db/fixtures/disks.json
57

    
58

    
59
8. MAKE SURE you setup a distinct BACKEND_PREFIX_ID, e.g., use your commit
60
   username. Make sure you call fix_amqp_settings() to setup use of individual
61
   queues on RabbiMQ.
62

    
63

    
64
9. The Ganeti monitoring daemon from the latest Synnefo release is already
65
   running on the development Ganeti master. You may also run your own, on your
66
   own Ganeti backend if you so wish.
67

    
68

    
69
10.As is.
70

    
71
11.The Synnefo Ganeti hook is already running on the development backend,
72
   sending notifications over AMQP.
73

    
74

    
75
12.The VNC authentication proxy is already running on the Ganeti development
76
   backend. You *cannot* run your own, unless you install your own Ganeti
77
   backend, because it needs direct access to the hypervisor's VNC port on
78
   GANETI-NODEs.
79

    
80
   Note: You still need to install the vncauthproxy package to satisfy
81
   the dependency of the API on the vncauthproxy client. See Synnefo #807
82
   for more details.
83

    
84

    
85
13.The development Ganeti backend already has a number of OS Images available.
86

    
87

    
88
14.The development Ganeti backend already has a number of pre-provisioned
89
   bridges available, per each BACKEND_PREFIX_ID.
90

    
91
   To setup simple NAT-based networking on a Ganeti backend on your own,
92
   please see the provided patches under contrib/patches/.
93
   You will need minor patches to the sample KVM ifup hook, kvm-vif-bridge,
94
   and a small patch to NFDHCPD to enable it to work with bridged tap+
95
   interfaces. To support bridged tap interfaces you also need to patch the
96
   python-nfqueue package, patches against python-nfqueue-0.3 [part of Debian
97
   Sid] are also provided under contrib/patches/.
98

    
99

    
100
15.As is.
101

    
102

    
103
16.As is.
104

    
105

    
106
17.[OPTIONAL] Create settings.d/99-local.conf and insert local overrides for
107
   settings.d/*.  This will allow pulling new files without needing to reapply
108
   local any local modifications.
109

    
110

    
111
South Database Migrations
112
=========================
113

    
114
* Initial Migration
115

    
116
First, remember to add the south app to settings.py (it is already included in
117
the settings.py.dist).
118

    
119
To initialise south migrations in your database the following commands must be
120
executed:
121

    
122
    $ ./bin/python manage.py syncdb       # Create / update the database with the south tables
123
    $ ./bin/python manage.py migrate db   # Perform migration in the database
124

    
125
Note that syncdb will create the latest models that exist in the db app, so some
126
migrations may fail.  If you are sure a migration has already taken place you
127
must use the "--fake" option, to apply it.
128

    
129
For example:
130

    
131
    $ ./bin/python manage.py migrate db 0001 --fake
132

    
133
To be sure that all migrations are applied type:
134

    
135
    $ ./bin/python manage.py migrate db --list
136

    
137
All starred migrations are applied.
138

    
139
Remember, the migration is performed mainly for the data, not for the database
140
schema. If you do not want to migrate the data, a syncdb and fake migrations for
141
all the migration versions will suffice.
142

    
143
* Schema migrations:
144

    
145
Do not use the syncdb management command. It can only be used the first time
146
and/or if you drop the database and must recreate it from scratch. See
147
"Initial Migration" section.
148

    
149
Every time you make changes to the database and data migration is not required
150
(WARNING: always perform this with extreme care):
151

    
152
    $ ./bin/python manage.py schemamigration db --auto
153

    
154
The above will create the migration script. Now this must be applied to the live
155
database.
156

    
157
    $ ./bin/python migrate db
158

    
159
Consider this example (adding a field to the SynnefoUser model):
160

    
161
    $ ./bin/python manage.py schemamigration db --auto
162
     + Added field new_south_test_field on db.SynnefoUser
163
     Created 0002_auto__add_field_synnefouser_new_south_test_field.py.
164

    
165
  You can now apply this migration with: ./manage.py migrate db
166

    
167
    $ ./manage.py migrate db
168
     Running migrations for db:
169
     - Migrating forwards to 0002_auto__add_field_synnefouser_new_south_test_field.
170
     > db:0002_auto__add_field_synnefouser_new_south_test_field
171
     - Loading initial data for db.
172
    Installing json fixture 'initial_data' from '/home/bkarak/devel/synnefo/../synnefo/db/fixtures'.
173
    Installed 1 object(s) from 1 fixture(s)
174

    
175
South needs some extra definitions to the model to preserve and migrate the
176
existing data, for example, if we add a field in a model, we should declare its
177
default value. If not, South will propably fail, after indicating the error.
178

    
179
    $ ./bin/python manage.py schemamigration db --auto
180
     ? The field 'SynnefoUser.new_south_field_2' does not have a default specified, yet is NOT NULL.
181
     ? Since you are adding or removing this field, you MUST specify a default
182
     ? value to use for existing rows. Would you like to:
183
     ?  1. Quit now, and add a default to the field in models.py
184
     ?  2. Specify a one-off value to use for existing columns now
185
     ? Please select a choice: 1
186

    
187
* Data migrations:
188

    
189
If we need to do data migration as well, for example rename a field, we use the
190
'datamigration' management command.
191

    
192
In contrast with schemamigration, to perform complex data migration, we must
193
write the script manually. The process is the following:
194

    
195
    1. Introduce the changes in the code and fixtures (initial data).
196
    2. Execute:
197

    
198
    $ ./bin/python manage.py datamigration <migration_name_here>
199

    
200
    For example:
201

    
202
    $ ./bin/python manage.py datamigration db rename_credit_wallet
203
    Created 0003_rename_credit_wallet.py.
204

    
205
    3. We edit the generated script. It contains two methods: forwards and
206
    backwards.
207

    
208
    For database operations (column additions, alter tables etc) we use the
209
    South database API (http://south.aeracode.org/docs/databaseapi.html).
210

    
211
    To access the data, we use the database reference (orm) provided as
212
    parameter in forwards, backwards method declarations in the migration
213
    script. For example:
214

    
215
    class Migration(DataMigration):
216

    
217
    def forwards(self, orm):
218
        orm.SynnefoUser.objects.all()
219

    
220
    4. To migrate the database to the latest version, we execute:
221

    
222
    ./manage.py migrate db
223

    
224
To see which migrations are applied:
225

    
226
    $ ./bin/python manage.py migrate db --list
227

    
228
      db
229
        (*) 0001_initial
230
        (*) 0002_auto__add_field_synnefouser_new_south_test_field
231
        (*) 0003_rename_credit_wallet
232

    
233
More information and more thorough examples can be found in the South web site.
234

    
235
http://south.aeracode.org/
236

    
237

    
238
UI Testing
239
==========
240
The functional ui tests require the Selenium server and the synnefo app to
241
be running.
242

    
243
    $ wget http://selenium.googlecode.com/files/selenium-server-standalone-2.0b2.jar
244
    $ java -jar selenium-server-standalone-2.0b2.jar &
245
    $ ./bin/python manage.py runserver &
246
    $ ./bin/python manage.py test ui
247

    
248

    
249
Test coverage
250
=============
251

    
252
In order to get code coverage reports you need to install django-test-coverage
253

    
254
   $ ./bin/pip install django-test-coverage
255

    
256
Then edit your settings.py and configure the test runner:
257

    
258
   TEST_RUNNER = 'django-test-coverage.runner.run_tests'