66 |
66 |
own Ganeti backend if you so wish.
|
67 |
67 |
|
68 |
68 |
|
69 |
|
10.As is.
|
|
69 |
10. As is.
|
70 |
70 |
|
71 |
|
11.The Synnefo Ganeti hook is already running on the development backend,
|
72 |
|
sending notifications over AMQP.
|
|
71 |
11. The Synnefo Ganeti hook is already running on the development backend,
|
|
72 |
sending notifications over AMQP.
|
73 |
73 |
|
74 |
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.
|
|
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 |
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.
|
|
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 |
83 |
|
84 |
84 |
|
85 |
|
13.The development Ganeti backend already has a number of OS Images available.
|
|
85 |
13. The development Ganeti backend already has a number of OS Images available.
|
86 |
86 |
|
87 |
87 |
|
88 |
|
14.The development Ganeti backend already has a number of pre-provisioned
|
89 |
|
bridges available, per each BACKEND_PREFIX_ID.
|
|
88 |
14. The development Ganeti backend already has a number of pre-provisioned
|
|
89 |
bridges available, per each BACKEND_PREFIX_ID.
|
90 |
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/.
|
|
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 |
98 |
|
99 |
99 |
|
100 |
|
15.As is.
|
|
100 |
15. As is.
|
101 |
101 |
|
102 |
102 |
|
103 |
|
16.As is.
|
|
103 |
16. As is.
|
104 |
104 |
|
105 |
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.
|
|
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 |
109 |
|
110 |
110 |
|
111 |
111 |
South Database Migrations
|
112 |
112 |
-------------------------
|
113 |
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).
|
|
114 |
Initial Migration
|
|
115 |
*****************
|
118 |
116 |
|
119 |
117 |
To initialise south migrations in your database the following commands must be
|
120 |
|
executed:
|
|
118 |
executed::
|
121 |
119 |
|
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
|
|
120 |
$ synnefo-manage syncdb # Create / update the database with the south tables
|
|
121 |
$ synnefo-manage migrate db # Perform migration in the database
|
124 |
122 |
|
125 |
123 |
Note that syncdb will create the latest models that exist in the db app, so some
|
126 |
124 |
migrations may fail. If you are sure a migration has already taken place you
|
127 |
125 |
must use the "--fake" option, to apply it.
|
128 |
126 |
|
129 |
|
For example:
|
|
127 |
For example::
|
130 |
128 |
|
131 |
|
$ ./bin/python manage.py migrate db 0001 --fake
|
|
129 |
$ synnefo-manage migrate db 0001 --fake
|
132 |
130 |
|
133 |
|
To be sure that all migrations are applied type:
|
|
131 |
To be sure that all migrations are applied type::
|
134 |
132 |
|
135 |
|
$ ./bin/python manage.py migrate db --list
|
|
133 |
$ synnefo-manage migrate db --list
|
136 |
134 |
|
137 |
135 |
All starred migrations are applied.
|
138 |
136 |
|
... | ... | |
140 |
138 |
schema. If you do not want to migrate the data, a syncdb and fake migrations for
|
141 |
139 |
all the migration versions will suffice.
|
142 |
140 |
|
143 |
|
* Schema migrations:
|
|
141 |
Schema migrations
|
|
142 |
*****************
|
144 |
143 |
|
145 |
144 |
Do not use the syncdb management command. It can only be used the first time
|
146 |
145 |
and/or if you drop the database and must recreate it from scratch. See
|
147 |
146 |
"Initial Migration" section.
|
148 |
147 |
|
149 |
148 |
Every time you make changes to the database and data migration is not required
|
150 |
|
(WARNING: always perform this with extreme care):
|
|
149 |
(WARNING: always perform this with extreme care)::
|
151 |
150 |
|
152 |
|
$ ./bin/python manage.py schemamigration db --auto
|
|
151 |
$ synnefo-manage schemamigration db --auto
|
153 |
152 |
|
154 |
153 |
The above will create the migration script. Now this must be applied to the live
|
155 |
|
database.
|
|
154 |
database::
|
156 |
155 |
|
157 |
|
$ ./bin/python migrate db
|
|
156 |
$ synnefo-manage migrate db
|
158 |
157 |
|
159 |
|
Consider this example (adding a field to the SynnefoUser model):
|
|
158 |
Consider this example (adding a field to the SynnefoUser model)::
|
160 |
159 |
|
161 |
160 |
$ ./bin/python manage.py schemamigration db --auto
|
162 |
161 |
+ Added field new_south_test_field on db.SynnefoUser
|
163 |
162 |
|
164 |
163 |
Created 0002_auto__add_field_synnefouser_new_south_test_field.py.
|
165 |
164 |
|
166 |
|
You can now apply this migration with: ./manage.py migrate db
|
|
165 |
You can now apply this migration with::
|
167 |
166 |
|
168 |
167 |
$ ./manage.py migrate db
|
169 |
168 |
Running migrations for db:
|
... | ... | |
176 |
175 |
|
177 |
176 |
South needs some extra definitions to the model to preserve and migrate the
|
178 |
177 |
existing data, for example, if we add a field in a model, we should declare its
|
179 |
|
default value. If not, South will propably fail, after indicating the error.
|
|
178 |
default value. If not, South will propably fail, after indicating the error::
|
180 |
179 |
|
181 |
180 |
$ ./bin/python manage.py schemamigration db --auto
|
182 |
181 |
? The field 'SynnefoUser.new_south_field_2' does not have a default specified, yet is NOT NULL.
|
... | ... | |
186 |
185 |
? 2. Specify a one-off value to use for existing columns now
|
187 |
186 |
? Please select a choice: 1
|
188 |
187 |
|
189 |
|
* Data migrations:
|
|
188 |
Data migrations
|
|
189 |
***************
|
190 |
190 |
|
191 |
191 |
If we need to do data migration as well, for example rename a field, we use the
|
192 |
192 |
'datamigration' management command.
|
... | ... | |
194 |
194 |
In contrast with schemamigration, to perform complex data migration, we must
|
195 |
195 |
write the script manually. The process is the following:
|
196 |
196 |
|
197 |
|
1. Introduce the changes in the code and fixtures (initial data).
|
198 |
|
2. Execute:
|
|
197 |
1. Introduce the changes in the code and fixtures (initial data).
|
|
198 |
2. Execute::
|
199 |
199 |
|
200 |
200 |
$ ./bin/python manage.py datamigration <migration_name_here>
|
201 |
201 |
|
202 |
|
For example:
|
203 |
|
|
204 |
|
$ ./bin/python manage.py datamigration db rename_credit_wallet
|
205 |
|
Created 0003_rename_credit_wallet.py.
|
206 |
|
|
207 |
|
3. We edit the generated script. It contains two methods: forwards and
|
208 |
|
backwards.
|
|
202 |
For example::
|
209 |
203 |
|
210 |
|
For database operations (column additions, alter tables etc) we use the
|
211 |
|
South database API (http://south.aeracode.org/docs/databaseapi.html).
|
|
204 |
$ ./bin/python manage.py datamigration db rename_credit_wallet
|
|
205 |
Created 0003_rename_credit_wallet.py.
|
212 |
206 |
|
213 |
|
To access the data, we use the database reference (orm) provided as
|
214 |
|
parameter in forwards, backwards method declarations in the migration
|
215 |
|
script. For example:
|
|
207 |
3. We edit the generated script. It contains two methods: forwards and
|
|
208 |
backwards.
|
216 |
209 |
|
217 |
|
class Migration(DataMigration):
|
|
210 |
For database operations (column additions, alter tables etc) we use the
|
|
211 |
South database API (http://south.aeracode.org/docs/databaseapi.html).
|
218 |
212 |
|
219 |
|
def forwards(self, orm):
|
220 |
|
orm.SynnefoUser.objects.all()
|
|
213 |
To access the data, we use the database reference (orm) provided as
|
|
214 |
parameter in forwards, backwards method declarations in the migration
|
|
215 |
script. For example::
|
221 |
216 |
|
222 |
|
4. To migrate the database to the latest version, we execute:
|
|
217 |
.. code-block:: python
|
223 |
218 |
|
224 |
|
./manage.py migrate db
|
|
219 |
class Migration(DataMigration):
|
225 |
220 |
|
226 |
|
To see which migrations are applied:
|
|
221 |
def forwards(self, orm):
|
|
222 |
orm.SynnefoUser.objects.all()
|
227 |
223 |
|
228 |
|
$ ./bin/python manage.py migrate db --list
|
|
224 |
4. To migrate the database to the latest version, we execute::
|
229 |
225 |
|
230 |
|
db
|
231 |
|
(*) 0001_initial
|
232 |
|
(*) 0002_auto__add_field_synnefouser_new_south_test_field
|
233 |
|
(*) 0003_rename_credit_wallet
|
|
226 |
$ synnefo-manage migrate db
|
234 |
227 |
|
235 |
|
More information and more thorough examples can be found in the South web site.
|
|
228 |
To see which migrations are applied::
|
236 |
229 |
|
237 |
|
http://south.aeracode.org/
|
|
230 |
$ synnefo-manage migrate db --list
|
238 |
231 |
|
|
232 |
db
|
|
233 |
(*) 0001_initial
|
|
234 |
(*) 0002_auto__add_field_synnefouser_new_south_test_field
|
|
235 |
(*) 0003_rename_credit_wallet
|
239 |
236 |
|
240 |
|
UI Testing
|
241 |
|
----------
|
242 |
|
The functional ui tests require the Selenium server and the synnefo app to
|
243 |
|
be running.
|
244 |
|
|
245 |
|
$ wget http://selenium.googlecode.com/files/selenium-server-standalone-2.0b2.jar
|
246 |
|
$ java -jar selenium-server-standalone-2.0b2.jar &
|
247 |
|
$ ./bin/python manage.py runserver &
|
248 |
|
$ ./bin/python manage.py test ui
|
|
237 |
.. seealso::
|
|
238 |
More information and more thorough examples can be found in the South web site.
|
|
239 |
http://south.aeracode.org/
|
249 |
240 |
|
250 |
241 |
|
251 |
242 |
Test coverage
|
252 |
243 |
-------------
|
253 |
244 |
|
254 |
|
In order to get code coverage reports you need to install django-test-coverage
|
|
245 |
In order to get code coverage reports you need to install django-test-coverage::
|
255 |
246 |
|
256 |
247 |
$ ./bin/pip install django-test-coverage
|
257 |
248 |
|
258 |
|
Then edit your settings.py and configure the test runner:
|
|
249 |
Then edit your settings.py and configure the test runner::
|
259 |
250 |
|
260 |
251 |
TEST_RUNNER = 'django-test-coverage.runner.run_tests'
|
261 |
252 |
|
262 |
253 |
|
263 |
254 |
.. include:: i18n.rst
|
264 |
255 |
|
|
256 |
|
265 |
257 |
Building Synnefo package
|
266 |
258 |
------------------------
|
267 |
259 |
|
... | ... | |
269 |
261 |
|
270 |
262 |
$ python setup.py sdist
|
271 |
263 |
|
272 |
|
this command will create a ``tar.gz`` python source package using
|
273 |
|
the version number provided in ``setup.py``.
|
|
264 |
this command will create a ``tar.gz`` python source package inside ``dist`` directory.
|
|
265 |
|
274 |
266 |
|
275 |
267 |
Building Synnefo documentation
|
276 |
268 |
------------------------------
|
... | ... | |
283 |
275 |
$ make html
|
284 |
276 |
|
285 |
277 |
html files are generated in ``docs/_build/html`` directory
|
|
278 |
|
|
279 |
.. include:: ci.rst
|