Statistics
| Branch: | Tag: | Revision:

root / README.develop @ 2b837adf

History | View | Annotate | Download (8.2 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

    
81
13.The development Ganeti backend already has a number of OS Images available.
82

    
83

    
84
14.The development Ganeti backend already has a number of pre-provisioned
85
   bridges available, per each BACKEND_PREFIX_ID.
86

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

    
95

    
96
15.As is.
97

    
98

    
99
16.As is.
100

    
101

    
102
South Database Migrations
103
=========================
104

    
105
* Initial Migration
106

    
107
First, remember to add the south app to settings.py (it is already included in
108
the settings.py.dist).
109

    
110
To initialise south migrations in your database the following commands must be
111
executed:
112

    
113
    $ ./bin/python manage.py syncdb       # Create / update the database with the south tables
114
    $ ./bin/python manage.py migrate db   # Perform migration in the database
115

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

    
120
For example:
121

    
122
    $ ./bin/python manage.py migrate db 0001 --fake
123

    
124
To be sure that all migrations are applied type:
125

    
126
    $ ./bin/python manage.py migrate db --list
127

    
128
All starred migrations are applied.
129

    
130
Remember, the migration is performed mainly for the data, not for the database
131
schema. If you do not want to migrate the data, a syncdb and fake migrations for
132
all the migration versions will suffice.
133

    
134
* Schema migrations:
135

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

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

    
143
    $ ./bin/python manage.py schemamigration db --auto
144

    
145
The above will create the migration script. Now this must be applied to the live
146
database.
147

    
148
    $ ./bin/python migrate db
149

    
150
Consider this example (adding a field to the SynnefoUser model):
151

    
152
    $ ./bin/python manage.py schemamigration db --auto
153
     + Added field new_south_test_field on db.SynnefoUser
154
     Created 0002_auto__add_field_synnefouser_new_south_test_field.py.
155

    
156
  You can now apply this migration with: ./manage.py migrate db
157

    
158
    $ ./manage.py migrate db
159
     Running migrations for db:
160
     - Migrating forwards to 0002_auto__add_field_synnefouser_new_south_test_field.
161
     > db:0002_auto__add_field_synnefouser_new_south_test_field
162
     - Loading initial data for db.
163
    Installing json fixture 'initial_data' from '/home/bkarak/devel/synnefo/../synnefo/db/fixtures'.
164
    Installed 1 object(s) from 1 fixture(s)
165

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

    
170
    $ ./bin/python manage.py schemamigration db --auto
171
     ? The field 'SynnefoUser.new_south_field_2' does not have a default specified, yet is NOT NULL.
172
     ? Since you are adding or removing this field, you MUST specify a default
173
     ? value to use for existing rows. Would you like to:
174
     ?  1. Quit now, and add a default to the field in models.py
175
     ?  2. Specify a one-off value to use for existing columns now
176
     ? Please select a choice: 1
177

    
178
* Data migrations:
179

    
180
If we need to do data migration as well, for example rename a field, we use the
181
'datamigration' management command.
182

    
183
In contrast with schemamigration, to perform complex data migration, we must
184
write the script manually. The process is the following:
185

    
186
    1. Introduce the changes in the code and fixtures (initial data).
187
    2. Execute:
188

    
189
    $ ./bin/python manage.py datamigration <migration_name_here>
190

    
191
    For example:
192

    
193
    $ ./bin/python manage.py datamigration db rename_credit_wallet
194
    Created 0003_rename_credit_wallet.py.
195

    
196
    3. We edit the generated script. It contains two methods: forwards and
197
    backwards.
198

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

    
202
    To access the data, we use the database reference (orm) provided as
203
    parameter in forwards, backwards method declarations in the migration
204
    script. For example:
205

    
206
    class Migration(DataMigration):
207

    
208
    def forwards(self, orm):
209
        orm.SynnefoUser.objects.all()
210

    
211
    4. To migrate the database to the latest version, we execute:
212

    
213
    ./manage.py migrate db
214

    
215
To see which migrations are applied:
216

    
217
    $ ./bin/python manage.py migrate db --list
218

    
219
      db
220
        (*) 0001_initial
221
        (*) 0002_auto__add_field_synnefouser_new_south_test_field
222
        (*) 0003_rename_credit_wallet
223

    
224
More information and more thorough examples can be found in the South web site.
225

    
226
http://south.aeracode.org/
227

    
228

    
229
UI Testing
230
==========
231
The functional ui tests require the Selenium server and the synnefo app to
232
be running.
233

    
234
    $ wget http://selenium.googlecode.com/files/selenium-server-standalone-2.0b2.jar
235
    $ java -jar selenium-server-standalone-2.0b2.jar &
236
    $ ./bin/python manage.py runserver &
237
    $ ./bin/python manage.py test ui
238

    
239

    
240
Test coverage
241
=============
242

    
243
In order to get code coverage reports you need to install django-test-coverage
244

    
245
   $ ./bin/pip install django-test-coverage
246

    
247
Then edit your settings.py and configure the test runner:
248

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