Statistics
| Branch: | Tag: | Revision:

root / README.deploy @ c0f6fb49

History | View | Annotate | Download (17.2 kB)

1 b71ae5b8 Vangelis Koukis
README.deploy -- Instructions for a basic deployment of Synnefo v0.5.1
2 bbd4f788 Georgios Gousios
3 03353341 Vangelis Koukis
This document describes the basic steps to obtain a basic, working Synnefo
4 03353341 Vangelis Koukis
deployment. It begins by examining the different node roles, then moves to the
5 03353341 Vangelis Koukis
installation and setup of distinct software components.
6 c807557e Vangelis Koukis
7 b71ae5b8 Vangelis Koukis
It is current as of Synnefo v0.5.1.
8 03353341 Vangelis Koukis
9 03353341 Vangelis Koukis
10 03353341 Vangelis Koukis
Node types
11 03353341 Vangelis Koukis
===========
12 03353341 Vangelis Koukis
13 03353341 Vangelis Koukis
Nodes in a Synnefo deployment belong in one of the following types:
14 03353341 Vangelis Koukis
15 03353341 Vangelis Koukis
 * DB:
16 271baf11 Nikos Skalkotos
   A node [or more than one nodes, if using an HA configuration], running a DB
17 271baf11 Nikos Skalkotos
   engine supported by the Django ORM layer. The DB is the single source of
18 271baf11 Nikos Skalkotos
   truth for the servicing of API requests by Synnefo.
19 03353341 Vangelis Koukis
   Services: PostgreSQL / MySQL
20 03353341 Vangelis Koukis
21 03353341 Vangelis Koukis
 * APISERVER:
22 271baf11 Nikos Skalkotos
   A node running the implementation of the OpenStack API, in Django. Any number
23 271baf11 Nikos Skalkotos
   of APISERVERs can be used, in a load-balancing configuration, without any
24 271baf11 Nikos Skalkotos
   special consideration. Access to a common DB ensures consistency.
25 03353341 Vangelis Koukis
   Services: Web server, vncauthproxy
26 03353341 Vangelis Koukis
27 03353341 Vangelis Koukis
 * QUEUE:
28 271baf11 Nikos Skalkotos
   A node running the RabbitMQ software, which provides AMQP functionality. More
29 271baf11 Nikos Skalkotos
   than one QUEUE nodes may be deployed, in an HA configuration. Such
30 03353341 Vangelis Koukis
   deployments require shared storage, provided e.g., by DRBD.
31 03353341 Vangelis Koukis
   Services: RabbitMQ [rabbitmq-server]
32 03353341 Vangelis Koukis
33 03353341 Vangelis Koukis
 * LOGIC:
34 03353341 Vangelis Koukis
   A node running the business logic of Synnefo, in Django. It dequeues
35 271baf11 Nikos Skalkotos
   messages from QUEUE nodes, and provides the context in which business logic
36 271baf11 Nikos Skalkotos
   functions run. It uses Django ORM to connect to the common DB and update the
37 271baf11 Nikos Skalkotos
   state of the system, based on notifications received from the rest of the
38 271baf11 Nikos Skalkotos
   infrastructure, over AMQP.
39 03353341 Vangelis Koukis
   Services: the Synnefo logic dispatcher [/logic/dispatcher.py]
40 03353341 Vangelis Koukis
41 03353341 Vangelis Koukis
 * GANETI-MASTER and GANETI-NODE:
42 03353341 Vangelis Koukis
   A single GANETI-MASTER and a large number of GANETI-NODEs constitute the
43 03353341 Vangelis Koukis
   Ganeti backend for Synnefo, which undertakes all VM management functions.
44 03353341 Vangelis Koukis
   Any APISERVER can issue commands to the GANETI-MASTER, over RAPI, to effect
45 03353341 Vangelis Koukis
   changes in the state of the VMs. The GANETI-MASTER runs the Ganeti request
46 03353341 Vangelis Koukis
   queue.
47 03353341 Vangelis Koukis
   Services:
48 271baf11 Nikos Skalkotos
     only on GANETI-MASTER:
49 3d9ae008 Vangelis Koukis
       the Synnefo Ganeti monitoring daemon [/ganeti/snf-ganeti-eventd]
50 271baf11 Nikos Skalkotos
       the Synnefo Ganeti hook [/ganeti/snf-ganeti-hook.py].
51 271baf11 Nikos Skalkotos
     on each GANETI_NODE:
52 271baf11 Nikos Skalkotos
       a deployment-specific KVM ifup script
53 271baf11 Nikos Skalkotos
       properly configured NFDHCPD
54 03353341 Vangelis Koukis
55 03353341 Vangelis Koukis
56 03353341 Vangelis Koukis
Installation Process
57 03353341 Vangelis Koukis
=====================
58 03353341 Vangelis Koukis
59 271baf11 Nikos Skalkotos
This section describes the installation process of the various node roles in a
60 271baf11 Nikos Skalkotos
Synnefo deployment.
61 03353341 Vangelis Koukis
62 03353341 Vangelis Koukis
63 03353341 Vangelis Koukis
0. Allocation of physical nodes:
64 03353341 Vangelis Koukis
   Determine the role of every physical node in your deployment.
65 03353341 Vangelis Koukis
66 03353341 Vangelis Koukis
67 03353341 Vangelis Koukis
1. Ganeti installation:
68 03353341 Vangelis Koukis
   Synnefo requires a working Ganeti installation at the backend. Installation
69 03353341 Vangelis Koukis
   of Ganeti is not covered by this document, please refer to
70 03353341 Vangelis Koukis
   http://docs.ganeti.org/ganeti/current/html for all the gory details. A
71 03353341 Vangelis Koukis
   successful Ganeti installation concludes with a working GANETI-MASTER and a
72 03353341 Vangelis Koukis
   number of GANETI-NODEs.
73 03353341 Vangelis Koukis
74 03353341 Vangelis Koukis
75 03353341 Vangelis Koukis
2. RabbitMQ installation:
76 271baf11 Nikos Skalkotos
   RabbitMQ is used as a generic message broker for the system. It should be
77 271baf11 Nikos Skalkotos
   installed on two seperate QUEUE nodes (VMs should be enough for the moment)
78 271baf11 Nikos Skalkotos
   in a high availability configuration as described here:
79 03353341 Vangelis Koukis
80 03353341 Vangelis Koukis
     http://www.rabbitmq.com/pacemaker.html
81 03353341 Vangelis Koukis
82 03353341 Vangelis Koukis
   After installation, create a user and set its permissions
83 03353341 Vangelis Koukis
     rabbitmqctl add_user okeanos 0k3@n0s
84 03353341 Vangelis Koukis
     rabbitmqctl set_permissions -p / okeanos  "^.*" ".*" ".*"
85 03353341 Vangelis Koukis
86 03353341 Vangelis Koukis
   The values set for the user and password must be mirrored in the
87 03353341 Vangelis Koukis
   RABBIT_* variables in settings.py (see step 6)
88 03353341 Vangelis Koukis
89 03353341 Vangelis Koukis
90 03353341 Vangelis Koukis
3. Web server installation:
91 03353341 Vangelis Koukis
   A Web Server (e.g., Apache) needs to be installed on the APISERVERs,
92 271baf11 Nikos Skalkotos
   and be configured to run the Synnefo Django project appropriately. Selection
93 271baf11 Nikos Skalkotos
   and configuration of a Web server is outside the scope of this document.
94 03353341 Vangelis Koukis
95 03353341 Vangelis Koukis
   For testing or development purposes, Django's own development server,
96 271baf11 Nikos Skalkotos
   `./manage.py runserver' can be used.
97 03353341 Vangelis Koukis
98 03353341 Vangelis Koukis
99 03353341 Vangelis Koukis
4. Installation of the Synnefo Django project:
100 3d9ae008 Vangelis Koukis
   As of v0.5 the Synnefo Django project needs to be installed on nodes
101 36cf1973 Vangelis Koukis
   of type APISERVER, LOGIC and on the GANETI-MASTER, with a properly
102 36cf1973 Vangelis Koukis
   configured settings.py. In later revisions, the specific parts of the Django
103 36cf1973 Vangelis Koukis
   project which need to run on each node type will be identified.
104 03353341 Vangelis Koukis
105 271baf11 Nikos Skalkotos
   Synnefo is written in Python 2.6 and depends on the following Python modules:
106 271baf11 Nikos Skalkotos
   [package versions confirmed to be compatible are in braces]
107 c807557e Vangelis Koukis
108 c807557e Vangelis Koukis
    * django 1.2 [Django==1.2.4]
109 c807557e Vangelis Koukis
    * simplejson [simplejson==2.1.3]
110 c807557e Vangelis Koukis
    * pycurl [pycurl==7.19.0]
111 c807557e Vangelis Koukis
    * python-dateutil  [python-dateutil==1.4.1]
112 36cf1973 Vangelis Koukis
      WARNING: version python-dateutil==2.0 downloaded by pip known *not* to
113 36cf1973 Vangelis Koukis
               work with Python 2.6
114 92ab6b1c Vangelis Koukis
    * python-ipy [IPy==0.75]
115 92ab6b1c Vangelis Koukis
        also verified to work with python-ipy 0.70-1 as shipped with Squeeze
116 c807557e Vangelis Koukis
    * south [south==0.7.1]
117 4ed2e471 Georgios Gousios
      WARNING: might not work with Debian squeeze's default south-0.7-1 package.
118 c807557e Vangelis Koukis
    * amqplib [amqplib==0.6.1]
119 4ed2e471 Georgios Gousios
    * lockfile [lockfile==0.8]
120 4ed2e471 Georgios Gousios
    * python-daemon [python-daemon==1.5.5]
121 03353341 Vangelis Koukis
122 03353341 Vangelis Koukis
   also, depending on the database engine of choice, on one of the following:
123 c807557e Vangelis Koukis
    * MySQL-python [MySQL-python==1.2.3]
124 c807557e Vangelis Koukis
    * psycopg2 [psycopg2==2.4]
125 03353341 Vangelis Koukis
126 271baf11 Nikos Skalkotos
   if the invitations application is deployed, the following dependencies should
127 271baf11 Nikos Skalkotos
   be installed:
128 c807557e Vangelis Koukis
    * pycrypto==2.1.0
129 03353341 Vangelis Koukis
130 45e3d1ac Vangelis Koukis
   To run the user interface tests, selenium must be installed
131 c807557e Vangelis Koukis
    * selenium [?]
132 c807557e Vangelis Koukis
133 03353341 Vangelis Koukis
   The easiest method for installation of the Django project is to setup a
134 03353341 Vangelis Koukis
   working environment through virtualenv. Alternatively, you can use your
135 03353341 Vangelis Koukis
   system's package manager to install the dependencies (e.g. Macports has them
136 03353341 Vangelis Koukis
   all).
137 a06deab3 Vangelis Koukis
138 36cf1973 Vangelis Koukis
   * On Snow Leopard and linux (64-bit), you have to set the following
139 36cf1973 Vangelis Koukis
     environment variable for pip to compile the dependencies correctly.
140 a06deab3 Vangelis Koukis
141 03353341 Vangelis Koukis
  	   $ export ARCHFLAGS="-arch x86_64"
142 a06deab3 Vangelis Koukis
143 03353341 Vangelis Koukis
   * On Ubuntu, a few more packages must be installed before installing the
144 03353341 Vangelis Koukis
     prerequisite Python libraries
145 a06deab3 Vangelis Koukis
146 03353341 Vangelis Koukis
	   $ sudo aptitude install libcurl3-gnutls libcurl3-gnutls-dev uuid-dev
147 a06deab3 Vangelis Koukis
148 271baf11 Nikos Skalkotos
   Checkout the code and install the Python prerequisites. This assumes that
149 271baf11 Nikos Skalkotos
   python is already installed on the host.
150 a06deab3 Vangelis Koukis
151 03353341 Vangelis Koukis
    $ sudo easy_install virtualenv
152 03353341 Vangelis Koukis
    $ git clone https://user@code.grnet.gr/git/synnefo synnefo
153 03353341 Vangelis Koukis
    $ virtualenv --python=python2.6 synnefo --no-site-packages
154 03353341 Vangelis Koukis
    ...
155 03353341 Vangelis Koukis
    $ cd synnefo
156 03353341 Vangelis Koukis
    $ ./bin/pip install <list_of_dependencies>
157 fc2afa67 Vangelis Koukis
158 33f3103d Georgios Gousios
    [WARNING]: The software must be checked out in a directory named synnefo,
159 33f3103d Georgios Gousios
    otherwise python imports will not work. Therefore, do not change the
160 33f3103d Georgios Gousios
    or rename the checkout path.
161 a06deab3 Vangelis Koukis
162 937ac8bf Vangelis Koukis
163 03353341 Vangelis Koukis
5. Database installation:
164 03353341 Vangelis Koukis
   A database supported by the Django ORM layer must be installed on nodes
165 03353341 Vangelis Koukis
   of type DB. The choices are: SQLIte, MySQL, PostgreSQL.
166 a06deab3 Vangelis Koukis
167 03353341 Vangelis Koukis
   * SQLite:
168 36cf1973 Vangelis Koukis
     The python sqlite driver is available by default with Python so no
169 36cf1973 Vangelis Koukis
     additional configuration is required. Also, most self-respecting systems
170 36cf1973 Vangelis Koukis
     have the sqlite library installed by default.
171 03353341 Vangelis Koukis
172 271baf11 Nikos Skalkotos
   * MySQL:
173 03353341 Vangelis Koukis
      MySQL must be installed first:
174 03353341 Vangelis Koukis
175 03353341 Vangelis Koukis
      * Ubuntu - Debian
176 03353341 Vangelis Koukis
	      $ sudo apt-get install libmysqlclient-dev
177 03353341 Vangelis Koukis
178 03353341 Vangelis Koukis
      * MacPorts
179 03353341 Vangelis Koukis
	      $ sudo port install mysql5
180 03353341 Vangelis Koukis
181 03353341 Vangelis Koukis
      Install the MySQL python library on servers running the Django project:
182 a06deab3 Vangelis Koukis
183 03353341 Vangelis Koukis
	    $ bin/pip install MySQL-python
184 a06deab3 Vangelis Koukis
185 36cf1973 Vangelis Koukis
      Note: On MacOSX with Mysql install from MacPorts the above command will
186 271baf11 Nikos Skalkotos
            fail complaining that it cannot find the mysql_config command. Do
187 271baf11 Nikos Skalkotos
            the following and restart the installation
188 271baf11 Nikos Skalkotos
	        $ echo "mysql_config = /opt/local/bin/mysql_config5" >> \
189 271baf11 Nikos Skalkotos
                                         ./build/MySQL-python/site.cfg
190 7e8b41e7 Vangelis Koukis
191 03353341 Vangelis Koukis
      Configure a MySQL db/account for synnefo
192 03353341 Vangelis Koukis
	    $ mysql -u root -p
193 a06deab3 Vangelis Koukis
194 03353341 Vangelis Koukis
    	mysql> create database synnefo;
195 03353341 Vangelis Koukis
	    mysql> show databases;
196 03353341 Vangelis Koukis
	    mysql> GRANT ALL on synnefo.* TO username IDENTIFIED BY 'password';
197 fc2afa67 Vangelis Koukis
198 03353341 Vangelis Koukis
   * PostgreSQL
199 03353341 Vangelis Koukis
     You need to install the PostgreSQL binaries:
200 03353341 Vangelis Koukis
     * Ubuntu - Debian
201 03353341 Vangelis Koukis
	     $ sudo apt-get install postgresql-8.4 libpq-dev
202 fc2afa67 Vangelis Koukis
203 03353341 Vangelis Koukis
     * MacPorts
204 03353341 Vangelis Koukis
	     $ sudo port install postgresql84
205 6ec8927b Vangelis Koukis
206 03353341 Vangelis Koukis
     Install the postgres Python library
207 03353341 Vangelis Koukis
	    $ bin/pip install psycopg2
208 6f339260 Georgios Gousios
209 03353341 Vangelis Koukis
     Configure a postgres db/account for synnefo:
210 6f339260 Georgios Gousios
211 03353341 Vangelis Koukis
     Become the postgres user, connect to PostgreSQL:
212 03353341 Vangelis Koukis
       $ sudo su - postgres
213 03353341 Vangelis Koukis
       $ psql
214 03353341 Vangelis Koukis
	
215 03353341 Vangelis Koukis
	 Run the following commands:
216 03353341 Vangelis Koukis
	   DROP DATABASE synnefo;
217 03353341 Vangelis Koukis
	   DROP USER username;
218 03353341 Vangelis Koukis
	   CREATE USER username WITH PASSWORD 'password';
219 03353341 Vangelis Koukis
	   CREATE DATABASE synnefo;
220 03353341 Vangelis Koukis
	   GRANT ALL PRIVILEGES ON DATABASE synnefo TO username;
221 03353341 Vangelis Koukis
	   ALTER DATABASE synnefo OWNER TO username;
222 03353341 Vangelis Koukis
	   ALTER USER username CREATEDB;
223 6f339260 Georgios Gousios
224 36cf1973 Vangelis Koukis
     The last line enables the newly created user to create own databases. This
225 36cf1973 Vangelis Koukis
     is needed for Django to create and drop the test_synnefo database for unit
226 03353341 Vangelis Koukis
     testing.
227 6f339260 Georgios Gousios
228 6f339260 Georgios Gousios
229 03353341 Vangelis Koukis
6. Setting up the Django project:
230 03353341 Vangelis Koukis
   The settings.py file for Django may be derived by concatenating the
231 03353341 Vangelis Koukis
   settings.py.dist file contained in the Synnefo distribution with a file
232 03353341 Vangelis Koukis
   containing custom modifications, which shall override all settings deviating
233 03353341 Vangelis Koukis
   from the supplied settings.py.dist. This is recommended to minimize the load
234 03353341 Vangelis Koukis
   of reconstructing settings.py from scratch, since each release currently
235 03353341 Vangelis Koukis
   brings heavy changes to settings.py.dist.
236 7e8b41e7 Vangelis Koukis
237 36cf1973 Vangelis Koukis
   Add the following to your custom settings.py, depending on your choice
238 36cf1973 Vangelis Koukis
   of DB:
239 03353341 Vangelis Koukis
   * SQLite
240 7e8b41e7 Vangelis Koukis
241 03353341 Vangelis Koukis
	 PROJECT_PATH = os.path.dirname(os.path.abspath(__file__)) + '/'
242 7e8b41e7 Vangelis Koukis
243 03353341 Vangelis Koukis
	 DATABASES = {
244 03353341 Vangelis Koukis
	     'default': {
245 03353341 Vangelis Koukis
		     'ENGINE': 'django.db.backends.sqlite3',
246 36cf1973 Vangelis Koukis
		     'NAME': PROJECT_PATH + 'synnefo.db' # WARN: This must be an absolute path
247 03353341 Vangelis Koukis
	     }
248 03353341 Vangelis Koukis
	 }
249 7e8b41e7 Vangelis Koukis
250 03353341 Vangelis Koukis
   * MySQL
251 7e8b41e7 Vangelis Koukis
252 03353341 Vangelis Koukis
 	 DATABASES = {
253 03353341 Vangelis Koukis
	     'default': {
254 03353341 Vangelis Koukis
             'ENGINE': 'django.db.backends.mysql',
255 03353341 Vangelis Koukis
             'NAME': 'synnefo',
256 03353341 Vangelis Koukis
             'USER': 'USERNAME',
257 03353341 Vangelis Koukis
             'PASSWORD': 'PASSWORD',
258 03353341 Vangelis Koukis
             'HOST': 'HOST',
259 03353341 Vangelis Koukis
             'PORT': 'PORT',
260 03353341 Vangelis Koukis
             'OPTIONS': {
261 03353341 Vangelis Koukis
                 'init_command': 'SET storage_engine=INNODB',
262 03353341 Vangelis Koukis
             }
263 03353341 Vangelis Koukis
	    }
264 03353341 Vangelis Koukis
	}
265 7e8b41e7 Vangelis Koukis
266 03353341 Vangelis Koukis
   * PostgreSQL
267 6f339260 Georgios Gousios
268 03353341 Vangelis Koukis
     DATABASES = {
269 03353341 Vangelis Koukis
	     'default': {
270 03353341 Vangelis Koukis
             'ENGINE': 'django.db.backends.postgresql_psycopg2',
271 03353341 Vangelis Koukis
             'NAME': 'DATABASE',
272 03353341 Vangelis Koukis
             'USER': 'USERNAME',
273 03353341 Vangelis Koukis
             'PASSWORD': 'PASSWORD',
274 03353341 Vangelis Koukis
             'HOST': 'HOST',
275 03353341 Vangelis Koukis
             'PORT': 'PORT',
276 03353341 Vangelis Koukis
	     }
277 03353341 Vangelis Koukis
     }
278 7e8b41e7 Vangelis Koukis
279 03353341 Vangelis Koukis
    Try it out. The following command will attempt to connect to the DB and
280 03353341 Vangelis Koukis
    print out DDL statements. It should not fail.
281 7e8b41e7 Vangelis Koukis
282 03353341 Vangelis Koukis
	$ ./bin/python manage.py sql db
283 6ec8927b Vangelis Koukis
284 6ec8927b Vangelis Koukis
285 03353341 Vangelis Koukis
7. Initialization of Synnefo DB:
286 03353341 Vangelis Koukis
   You need to initialize the Synnefo DB and load fixtures
287 03353341 Vangelis Koukis
   db/fixtures/{flavors,images}.json, which make the API usable by end users by
288 03353341 Vangelis Koukis
   defining a sample set of hardware configurations (flavors) and OS images.
289 03353341 Vangelis Koukis
290 03353341 Vangelis Koukis
     $ ./bin/python manage.py syncdb
291 03353341 Vangelis Koukis
     $ ./bin/python manage.py migrate db
292 03353341 Vangelis Koukis
     $ ./bin/python manage.py loaddata db/fixtures/flavors.json
293 03353341 Vangelis Koukis
     $ ./bin/python manage.py loaddata db/fixtures/images.json
294 03353341 Vangelis Koukis
295 03353341 Vangelis Koukis
296 03353341 Vangelis Koukis
8. Finalization of settings.py:
297 03353341 Vangelis Koukis
   Set the BACKEND_PREFIX_ID variable to some unique prefix, e.g. your commit
298 03353341 Vangelis Koukis
   username in settings.py. Several functional conventions within the system
299 03353341 Vangelis Koukis
   require this variable to include a dash at its end (e.g. snf-)
300 03353341 Vangelis Koukis
301 03353341 Vangelis Koukis
   Fix the AMQP-specific settings based on the selected BACKEND_PREFIX_ID.
302 03353341 Vangelis Koukis
   The fix_amqp_settings() function is called once at the end of
303 271baf11 Nikos Skalkotos
   settings.py.dist, you must call it again if you change BACKEND_PREFIX_ID at
304 271baf11 Nikos Skalkotos
   some later point.
305 03353341 Vangelis Koukis
306 03353341 Vangelis Koukis
307 36cf1973 Vangelis Koukis
9. Installation of the Ganeti monitoring daemon, /ganeti/snf-ganeti-eventd:
308 36cf1973 Vangelis Koukis
   The Ganeti monitoring daemon must run on GANETI-MASTER.
309 36cf1973 Vangelis Koukis
   The Ganeti monitoring daemon has no dependency on Django.
310 937ac8bf Vangelis Koukis
311 36cf1973 Vangelis Koukis
   Override all relevant settings in settings.d/99-snf-ganeti-eventd.conf,
312 36cf1973 Vangelis Koukis
   GANETI_* variables.
313 36cf1973 Vangelis Koukis
   Then, make sure PYTHONPATH contains the parent of the Django project,
314 36cf1973 Vangelis Koukis
   and start the server on the Ganeti master as root.
315 03353341 Vangelis Koukis
316 36cf1973 Vangelis Koukis
     root:~# export PYTHONPATH=$PYTHONPATH:/opt
317 36cf1973 Vangelis Koukis
     root:~# /opt/synnefo/ganeti/snf-ganeti-eventd.py
318 03353341 Vangelis Koukis
319 03353341 Vangelis Koukis
   TBD: how to handle master migration.
320 03353341 Vangelis Koukis
321 6ec8927b Vangelis Koukis
322 03353341 Vangelis Koukis
10. Installation of the Synnefo dispatcher, /logic/dispatcher.py:
323 03353341 Vangelis Koukis
    The logic dispatcher is part of the Synnefo Django project and must run
324 03353341 Vangelis Koukis
    on LOGIC nodes.
325 ff55193e Vangelis Koukis
326 271baf11 Nikos Skalkotos
    The dispatcher retrieves messages from the queue and calls the appropriate
327 271baf11 Nikos Skalkotos
    handler function as defined in the queue configuration in `setttings.py'.
328 271baf11 Nikos Skalkotos
    The default configuration should work directly without any modifications.
329 6ec8927b Vangelis Koukis
330 03353341 Vangelis Koukis
    For the time being The dispatcher must be run by hand:
331 03353341 Vangelis Koukis
      $ ./bin/python ./logic/dispatcher.py
332 6ec8927b Vangelis Koukis
333 03353341 Vangelis Koukis
    The dispatcher should run in at least 2 instances to ensure high
334 03353341 Vangelis Koukis
    (actually, increased) availability.
335 6ec8927b Vangelis Koukis
336 7e8b41e7 Vangelis Koukis
337 03353341 Vangelis Koukis
11. Installation of the Synnefo Ganeti hook:
338 c952d4e4 Vangelis Koukis
    The bash wrapper ganeti/snf-ganeti-hook is the generic launcher for
339 c952d4e4 Vangelis Koukis
    Synnefo hooks in Ganeti. It resides in the ganeti/ directory under the
340 36cf1973 Vangelis Koukis
    root of the Synnefo Django project.
341 7e8b41e7 Vangelis Koukis
342 271baf11 Nikos Skalkotos
    The hook needs to be enabled for phases post-{add,modify,reboot,start,stop}
343 271baf11 Nikos Skalkotos
    by *symlinking* in
344 271baf11 Nikos Skalkotos
    /etc/ganeti/hooks/instance-{add,modify,reboot,start,stop}-post.d on
345 271baf11 Nikos Skalkotos
    GANETI-MASTER, e.g.:
346 7e8b41e7 Vangelis Koukis
347 03353341 Vangelis Koukis
    root@ganeti-master:/etc/ganeti/hooks/instance-start-post.d# ls -l
348 c952d4e4 Vangelis Koukis
    lrwxrwxrwx 1 root root 45 May   3 13:45 00-snf-ganeti-hook -> /home/devel/synnefo/ganeti/snf-ganeti-hook
349 b6382dc5 Vangelis Koukis
350 03353341 Vangelis Koukis
    IMPORTANT: The link name may only contain "upper and lower case, digits,
351 03353341 Vangelis Koukis
    underscores and hyphens. In other words, the regexp ^[a-zA-Z0-9_-]+$."
352 271baf11 Nikos Skalkotos
    See:
353 271baf11 Nikos Skalkotos
     http://docs.ganeti.org/ganeti/master/html/hooks.html?highlight=hooks#naming
354 7e8b41e7 Vangelis Koukis
355 c952d4e4 Vangelis Koukis
    You need to set SYNNEFO_PROJECT_DIR in ganeti/snf-ganeti-hook. The bash
356 c952d4e4 Vangelis Koukis
    script modifies PYTHONPATH accordingly, before passing control to the
357 c952d4e4 Vangelis Koukis
    relevant Python code.
358 81d1a961 Constantinos Venetsanopoulos
359 81d1a961 Constantinos Venetsanopoulos
360 03353341 Vangelis Koukis
12. Installation of the VNC authentication proxy, vncauthproxy:
361 03353341 Vangelis Koukis
    To support OOB console access to the VMs over VNC, the vncauthproxy
362 03353341 Vangelis Koukis
    daemon must be running on every node of type APISERVER.
363 81d1a961 Constantinos Venetsanopoulos
364 03353341 Vangelis Koukis
    Download and install vncauthproxy from its own repository,
365 50a48b39 Vangelis Koukis
    at https://code.grnet.gr/git/vncauthproxy (known good commit: tag v1.0).
366 a06deab3 Vangelis Koukis
367 937ac8bf Vangelis Koukis
    Download and install a specific repository commit:
368 937ac8bf Vangelis Koukis
369 937ac8bf Vangelis Koukis
    $ bin/pip install -e git+https://code.grnet.gr/git/vncauthproxy@INSERT_COMMIT_HERE#egg=vncauthproxy
370 937ac8bf Vangelis Koukis
371 03353341 Vangelis Koukis
    Create /var/log/vncauthproxy and set its permissions appropriately.
372 fc2afa67 Vangelis Koukis
373 937ac8bf Vangelis Koukis
    Alternatively, you can build Debian packages. To do so,
374 937ac8bf Vangelis Koukis
    checkout the "debian" branch of the vncauthproxy repository
375 50a48b39 Vangelis Koukis
    (known good commit: tag debian/v1.0):
376 937ac8bf Vangelis Koukis
377 937ac8bf Vangelis Koukis
    $ git checkout debian
378 937ac8bf Vangelis Koukis
379 937ac8bf Vangelis Koukis
    Then build debian package, and install as root:
380 937ac8bf Vangelis Koukis
381 937ac8bf Vangelis Koukis
    $ dpkg-buildpackage -b -uc -us
382 937ac8bf Vangelis Koukis
    # dpkg -i ../vncauthproxy_1.0-1_all.deb
383 937ac8bf Vangelis Koukis
384 141f3009 Georgios Gousios
    --Failure to build the package on the Mac.
385 141f3009 Georgios Gousios
386 141f3009 Georgios Gousios
    libevent, a requirement for gevent which in turn is a requirement for
387 141f3009 Georgios Gousios
    vncauthproxy is not included in MacOSX by default and installing it with
388 141f3009 Georgios Gousios
    MacPorts does not lead to a version that can be found by the gevent
389 141f3009 Georgios Gousios
    build process. A quick workaround is to execute the following commands:
390 141f3009 Georgios Gousios
391 141f3009 Georgios Gousios
    cd $SYNNEFO
392 141f3009 Georgios Gousios
    sudo pip install -e git+https://code.grnet.gr/git/vncauthproxy@5a196d8481e171a#egg=vncauthproxy
393 141f3009 Georgios Gousios
    <the above fails>
394 141f3009 Georgios Gousios
    cd build/gevent
395 141f3009 Georgios Gousios
    sudo python setup.py -I/opt/local/include -L/opt/local/lib build
396 141f3009 Georgios Gousios
    cd $SYNNEFO
397 141f3009 Georgios Gousios
    sudo pip install -e git+https://code.grnet.gr/git/vncauthproxy@5a196d8481e171a#egg=vncauthproxy
398 fc2afa67 Vangelis Koukis
399 03353341 Vangelis Koukis
13. Installation of the customized Ganeti Instance Image for image deployment:
400 03353341 Vangelis Koukis
    For Synnefo to be able to launch VMs from specified Images, you need
401 03353341 Vangelis Koukis
    the gnt-instance-image OS Provider installed on the Ganeti backend.
402 03353341 Vangelis Koukis
403 03353341 Vangelis Koukis
    Download and install gnt-instance-image in all Ganeti nodes from its own
404 76422b0f Nikos Skalkotos
    repository, at https://code.grnet.gr/git/gnt-instance-image. It's
405 f1c3355e Nikos Skalkotos
    recommended to use the win-support branch (known good commit:
406 f1c3355e Nikos Skalkotos
    aa661a7ea6da9c11a05a3587ee61d10348eb7422).
407 03353341 Vangelis Koukis
408 03353341 Vangelis Koukis
    After installing gnt-instance-image do the following:
409 f077e519 Nikos Skalkotos
    1. root@ganeti-master$ cd /path-to-repo
410 f077e519 Nikos Skalkotos
       root@ganeti-master$ cp ./defaults /etc/default/ganeti-instance-image
411 03353341 Vangelis Koukis
    2. Uncomment the following in /etc/default/ganeti-instance-image:
412 271baf11 Nikos Skalkotos
         SWAP=no
413 271baf11 Nikos Skalkotos
         ARCH="x86_64"
414 89de2525 Nikos Skalkotos
    3. In /etc/ganeti/instance-image/hooks, make sure the hooks you want to
415 89de2525 Nikos Skalkotos
       run during instance creation process have execute permission.
416 89de2525 Nikos Skalkotos
       For linux you will need at lease `grub' and `root_passwd' to make the
417 89de2525 Nikos Skalkotos
       instance usable:
418 f6018cb1 Nikos Skalkotos
         chmod +x /etc/ganeti/instance-image/hooks/linux/{grub,root_passwd}
419 76422b0f Nikos Skalkotos
       For security reasons make sure `ssh' hook is also enabled.
420 f6018cb1 Nikos Skalkotos
       For windows you will need `mbr' and `admin_passwd':
421 f6018cb1 Nikos Skalkotos
         chmod +x /etc/ganeti/instance-image/hooks/windows/{mbr,admin_passwd}
422 89de2525 Nikos Skalkotos
       For both architectures it is also highly recommended to enable
423 f6018cb1 Nikos Skalkotos
       `hostname' hook too:
424 f6018cb1 Nikos Skalkotos
         chmod +x /et/ganeti/instance-image/hooks/{linux,windows}/hostname
425 03353341 Vangelis Koukis
426 271baf11 Nikos Skalkotos
    Your Custom Images should be stored in a dump format under
427 271baf11 Nikos Skalkotos
    /var/cache/ganeti-instance-image and their filenames should have the
428 271baf11 Nikos Skalkotos
    following format:
429 03353341 Vangelis Koukis
      {backend_id}-x86_64-root.dump
430 03353341 Vangelis Koukis
    e.g., debian-6.0.1a-x86_64-root.dump (backend_id = "debian-6.0.1a")
431 76a429fb Georgios Gousios
432 03353341 Vangelis Koukis
14. Setup Synnefo-specific networking on the Ganeti backend:
433 03353341 Vangelis Koukis
    This part is deployment-specific and must be customized based on the
434 03353341 Vangelis Koukis
    specific needs of the system administrators.
435 76a429fb Georgios Gousios
436 03353341 Vangelis Koukis
    A reference installation will use a Synnefo-specific KVM ifup script,
437 03353341 Vangelis Koukis
    NFDHCPD and pre-provisioned Linux bridges to support public and private
438 03353341 Vangelis Koukis
    network functionality. For this:
439 76a429fb Georgios Gousios
440 03353341 Vangelis Koukis
    Grab NFDHCPD from its own repository (https://code.grnet.gr/git/nfdhcpd),
441 03353341 Vangelis Koukis
    install it, modify /etc/nfdhcpd/nfdhcpd.conf to reflect your network
442 03353341 Vangelis Koukis
    configuration.
443 76a429fb Georgios Gousios
444 03353341 Vangelis Koukis
    Install a custom KVM ifup script for use by Ganeti, as
445 03353341 Vangelis Koukis
    /etc/ganeti/kvm-vif-bridge, on GANETI-NODEs. A sample implementation is
446 03353341 Vangelis Koukis
    provided under /contrib/ganeti-hooks. Set NFDHCPD_STATE_DIR to point
447 03353341 Vangelis Koukis
    to NFDHCPD's state directory, usually /var/lib/nfdhcpd.
448 76a429fb Georgios Gousios
449 76a429fb Georgios Gousios
450 03353341 Vangelis Koukis
15. Create log file directories for Synnefo components, set appropriate
451 36cf1973 Vangelis Koukis
    permissions. By default logic/dispatcher.py and ganeti/snf-ganeti-eventd.py
452 03353341 Vangelis Koukis
    use /var/log/synnefo.
453 76a429fb Georgios Gousios
454 7e8b41e7 Vangelis Koukis
455 03353341 Vangelis Koukis
16. (Hopefully) Done