Statistics
| Branch: | Tag: | Revision:

root / README.deploy @ 271baf11

History | View | Annotate | Download (15.8 kB)

1 03353341 Vangelis Koukis
README.deploy -- Instructions for a basic deployment of Synnefo v0.4
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 03353341 Vangelis Koukis
It applies to Synnefo v0.4.
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 271baf11 Nikos Skalkotos
       the Synnefo Ganeti monitoring daemon [/ganeti/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 271baf11 Nikos Skalkotos
   As of v0.4, the Synnefo Django project needs to be installed on nodes of type
101 271baf11 Nikos Skalkotos
   APISERVER, LOGIC and on the GANETI-MASTER, with a properly configured
102 03353341 Vangelis Koukis
   settings.py. In later revisions, the specific parts of the Django project
103 03353341 Vangelis Koukis
   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 271baf11 Nikos Skalkotos
      WARNING: version python-dateutil==2.0 downloaded by pip known *not* to
113 271baf11 Nikos Skalkotos
      work with Python 2.6
114 c807557e Vangelis Koukis
    * south [south==0.7.1]
115 c807557e Vangelis Koukis
      WARNING: not working with Debian squeeze's default south-0.7-1 package.
116 c807557e Vangelis Koukis
    * amqplib [amqplib==0.6.1]
117 03353341 Vangelis Koukis
118 03353341 Vangelis Koukis
   also, depending on the database engine of choice, on one of the following:
119 c807557e Vangelis Koukis
    * MySQL-python [MySQL-python==1.2.3]
120 c807557e Vangelis Koukis
    * psycopg2 [psycopg2==2.4]
121 03353341 Vangelis Koukis
122 271baf11 Nikos Skalkotos
   if the invitations application is deployed, the following dependencies should
123 271baf11 Nikos Skalkotos
   be installed:
124 c807557e Vangelis Koukis
    * pycrypto==2.1.0
125 03353341 Vangelis Koukis
126 03353341 Vangelis Koukis
   if you want to test the ganeti (FIXME)
127 03353341 Vangelis Koukis
128 271baf11 Nikos Skalkotos
   to run the user interface tests, selenium must be installed:
129 c807557e Vangelis Koukis
    * selenium [?]
130 c807557e Vangelis Koukis
131 03353341 Vangelis Koukis
   The easiest method for installation of the Django project is to setup a
132 03353341 Vangelis Koukis
   working environment through virtualenv. Alternatively, you can use your
133 03353341 Vangelis Koukis
   system's package manager to install the dependencies (e.g. Macports has them
134 03353341 Vangelis Koukis
   all).
135 a06deab3 Vangelis Koukis
136 271baf11 Nikos Skalkotos
   * On Snow Leopard and linux (64-bit), you have to set the following
137 271baf11 Nikos Skalkotos
     environment variable for pip to compile the dependencies correctly.
138 a06deab3 Vangelis Koukis
139 03353341 Vangelis Koukis
  	   $ export ARCHFLAGS="-arch x86_64"
140 a06deab3 Vangelis Koukis
141 03353341 Vangelis Koukis
   * On Ubuntu, a few more packages must be installed before installing the
142 03353341 Vangelis Koukis
     prerequisite Python libraries
143 a06deab3 Vangelis Koukis
144 03353341 Vangelis Koukis
	   $ sudo aptitude install libcurl3-gnutls libcurl3-gnutls-dev uuid-dev
145 a06deab3 Vangelis Koukis
146 271baf11 Nikos Skalkotos
   Checkout the code and install the Python prerequisites. This assumes that
147 271baf11 Nikos Skalkotos
   python is already installed on the host.
148 a06deab3 Vangelis Koukis
149 03353341 Vangelis Koukis
    $ sudo easy_install virtualenv
150 03353341 Vangelis Koukis
    $ git clone https://user@code.grnet.gr/git/synnefo synnefo
151 03353341 Vangelis Koukis
    $ virtualenv --python=python2.6 synnefo --no-site-packages
152 03353341 Vangelis Koukis
    ...
153 03353341 Vangelis Koukis
    $ cd synnefo
154 03353341 Vangelis Koukis
    $ ./bin/pip install <list_of_dependencies>
155 fc2afa67 Vangelis Koukis
156 a06deab3 Vangelis Koukis
157 03353341 Vangelis Koukis
5. Database installation:
158 03353341 Vangelis Koukis
   A database supported by the Django ORM layer must be installed on nodes
159 03353341 Vangelis Koukis
   of type DB. The choices are: SQLIte, MySQL, PostgreSQL.
160 a06deab3 Vangelis Koukis
161 03353341 Vangelis Koukis
   * SQLite:
162 271baf11 Nikos Skalkotos
     The python sqlite driver is available by default with Python so no
163 271baf11 Nikos Skalkotos
     additional configuration is required. Also, most self-respecting systems
164 271baf11 Nikos Skalkotos
     have the sqlite library installed by default.
165 03353341 Vangelis Koukis
166 271baf11 Nikos Skalkotos
   * MySQL:
167 03353341 Vangelis Koukis
      MySQL must be installed first:
168 03353341 Vangelis Koukis
169 03353341 Vangelis Koukis
      * Ubuntu - Debian
170 03353341 Vangelis Koukis
	      $ sudo apt-get install libmysqlclient-dev
171 03353341 Vangelis Koukis
172 03353341 Vangelis Koukis
      * MacPorts
173 03353341 Vangelis Koukis
	      $ sudo port install mysql5
174 03353341 Vangelis Koukis
175 03353341 Vangelis Koukis
      Install the MySQL python library on servers running the Django project:
176 a06deab3 Vangelis Koukis
177 03353341 Vangelis Koukis
	    $ bin/pip install MySQL-python
178 a06deab3 Vangelis Koukis
179 271baf11 Nikos Skalkotos
      Note: On MacOSX with Mysql install from MacPorts the above command will
180 271baf11 Nikos Skalkotos
            fail complaining that it cannot find the mysql_config command. Do
181 271baf11 Nikos Skalkotos
            the following and restart the installation
182 271baf11 Nikos Skalkotos
	        $ echo "mysql_config = /opt/local/bin/mysql_config5" >> \
183 271baf11 Nikos Skalkotos
                                         ./build/MySQL-python/site.cfg
184 7e8b41e7 Vangelis Koukis
185 03353341 Vangelis Koukis
      Configure a MySQL db/account for synnefo
186 03353341 Vangelis Koukis
	    $ mysql -u root -p
187 a06deab3 Vangelis Koukis
188 03353341 Vangelis Koukis
    	mysql> create database synnefo;
189 03353341 Vangelis Koukis
	    mysql> show databases;
190 03353341 Vangelis Koukis
	    mysql> GRANT ALL on synnefo.* TO username IDENTIFIED BY 'password';
191 fc2afa67 Vangelis Koukis
192 03353341 Vangelis Koukis
   * PostgreSQL
193 03353341 Vangelis Koukis
     You need to install the PostgreSQL binaries:
194 03353341 Vangelis Koukis
     * Ubuntu - Debian
195 03353341 Vangelis Koukis
	     $ sudo apt-get install postgresql-8.4 libpq-dev
196 fc2afa67 Vangelis Koukis
197 03353341 Vangelis Koukis
     * MacPorts
198 03353341 Vangelis Koukis
	     $ sudo port install postgresql84
199 6ec8927b Vangelis Koukis
200 03353341 Vangelis Koukis
     Install the postgres Python library
201 03353341 Vangelis Koukis
	    $ bin/pip install psycopg2
202 6f339260 Georgios Gousios
203 03353341 Vangelis Koukis
     Configure a postgres db/account for synnefo:
204 6f339260 Georgios Gousios
205 03353341 Vangelis Koukis
     Become the postgres user, connect to PostgreSQL:
206 03353341 Vangelis Koukis
       $ sudo su - postgres
207 03353341 Vangelis Koukis
       $ psql
208 03353341 Vangelis Koukis
	
209 03353341 Vangelis Koukis
	 Run the following commands:
210 03353341 Vangelis Koukis
	   DROP DATABASE synnefo;
211 03353341 Vangelis Koukis
	   DROP USER username;
212 03353341 Vangelis Koukis
	   CREATE USER username WITH PASSWORD 'password';
213 03353341 Vangelis Koukis
	   CREATE DATABASE synnefo;
214 03353341 Vangelis Koukis
	   GRANT ALL PRIVILEGES ON DATABASE synnefo TO username;
215 03353341 Vangelis Koukis
	   ALTER DATABASE synnefo OWNER TO username;
216 03353341 Vangelis Koukis
	   ALTER USER username CREATEDB;
217 6f339260 Georgios Gousios
218 271baf11 Nikos Skalkotos
     The last line enables the newly created user to create own databases. This
219 271baf11 Nikos Skalkotos
     is needed for Django to create and drop the test_synnefo database for unit
220 03353341 Vangelis Koukis
     testing.
221 6f339260 Georgios Gousios
222 6f339260 Georgios Gousios
223 03353341 Vangelis Koukis
6. Setting up the Django project:
224 03353341 Vangelis Koukis
   The settings.py file for Django may be derived by concatenating the
225 03353341 Vangelis Koukis
   settings.py.dist file contained in the Synnefo distribution with a file
226 03353341 Vangelis Koukis
   containing custom modifications, which shall override all settings deviating
227 03353341 Vangelis Koukis
   from the supplied settings.py.dist. This is recommended to minimize the load
228 03353341 Vangelis Koukis
   of reconstructing settings.py from scratch, since each release currently
229 03353341 Vangelis Koukis
   brings heavy changes to settings.py.dist.
230 7e8b41e7 Vangelis Koukis
231 03353341 Vangelis Koukis
   Add the following to your custom settings.py, depending on your choice of DB:
232 03353341 Vangelis Koukis
   * SQLite
233 7e8b41e7 Vangelis Koukis
234 03353341 Vangelis Koukis
	 PROJECT_PATH = os.path.dirname(os.path.abspath(__file__)) + '/'
235 7e8b41e7 Vangelis Koukis
236 03353341 Vangelis Koukis
	 DATABASES = {
237 03353341 Vangelis Koukis
	     'default': {
238 03353341 Vangelis Koukis
		     'ENGINE': 'django.db.backends.sqlite3',
239 03353341 Vangelis Koukis
		     'NAME': PROJECT_PATH + 'synnefo.db' #WARN: This must be an absolute path
240 03353341 Vangelis Koukis
	     }
241 03353341 Vangelis Koukis
	 }
242 7e8b41e7 Vangelis Koukis
243 03353341 Vangelis Koukis
   * MySQL
244 7e8b41e7 Vangelis Koukis
245 03353341 Vangelis Koukis
 	 DATABASES = {
246 03353341 Vangelis Koukis
	     'default': {
247 03353341 Vangelis Koukis
             'ENGINE': 'django.db.backends.mysql',
248 03353341 Vangelis Koukis
             'NAME': 'synnefo',
249 03353341 Vangelis Koukis
             'USER': 'USERNAME',
250 03353341 Vangelis Koukis
             'PASSWORD': 'PASSWORD',
251 03353341 Vangelis Koukis
             'HOST': 'HOST',
252 03353341 Vangelis Koukis
             'PORT': 'PORT',
253 03353341 Vangelis Koukis
             'OPTIONS': {
254 03353341 Vangelis Koukis
                 'init_command': 'SET storage_engine=INNODB',
255 03353341 Vangelis Koukis
             }
256 03353341 Vangelis Koukis
	    }
257 03353341 Vangelis Koukis
	}
258 7e8b41e7 Vangelis Koukis
259 03353341 Vangelis Koukis
   * PostgreSQL
260 6f339260 Georgios Gousios
261 03353341 Vangelis Koukis
     DATABASES = {
262 03353341 Vangelis Koukis
	     'default': {
263 03353341 Vangelis Koukis
             'ENGINE': 'django.db.backends.postgresql_psycopg2',
264 03353341 Vangelis Koukis
             'NAME': 'DATABASE',
265 03353341 Vangelis Koukis
             'USER': 'USERNAME',
266 03353341 Vangelis Koukis
             'PASSWORD': 'PASSWORD',
267 03353341 Vangelis Koukis
             'HOST': 'HOST',
268 03353341 Vangelis Koukis
             'PORT': 'PORT',
269 03353341 Vangelis Koukis
	     }
270 03353341 Vangelis Koukis
     }
271 7e8b41e7 Vangelis Koukis
272 03353341 Vangelis Koukis
    Try it out. The following command will attempt to connect to the DB and
273 03353341 Vangelis Koukis
    print out DDL statements. It should not fail.
274 7e8b41e7 Vangelis Koukis
275 03353341 Vangelis Koukis
	$ ./bin/python manage.py sql db
276 6ec8927b Vangelis Koukis
277 6ec8927b Vangelis Koukis
278 03353341 Vangelis Koukis
7. Initialization of Synnefo DB:
279 03353341 Vangelis Koukis
   You need to initialize the Synnefo DB and load fixtures
280 03353341 Vangelis Koukis
   db/fixtures/{flavors,images}.json, which make the API usable by end users by
281 03353341 Vangelis Koukis
   defining a sample set of hardware configurations (flavors) and OS images.
282 03353341 Vangelis Koukis
283 03353341 Vangelis Koukis
     $ ./bin/python manage.py syncdb
284 03353341 Vangelis Koukis
     $ ./bin/python manage.py migrate db
285 03353341 Vangelis Koukis
     $ ./bin/python manage.py loaddata db/fixtures/flavors.json
286 03353341 Vangelis Koukis
     $ ./bin/python manage.py loaddata db/fixtures/images.json
287 03353341 Vangelis Koukis
288 03353341 Vangelis Koukis
289 03353341 Vangelis Koukis
8. Finalization of settings.py:
290 03353341 Vangelis Koukis
   Set the BACKEND_PREFIX_ID variable to some unique prefix, e.g. your commit
291 03353341 Vangelis Koukis
   username in settings.py. Several functional conventions within the system
292 03353341 Vangelis Koukis
   require this variable to include a dash at its end (e.g. snf-)
293 03353341 Vangelis Koukis
294 03353341 Vangelis Koukis
   Fix the AMQP-specific settings based on the selected BACKEND_PREFIX_ID.
295 03353341 Vangelis Koukis
   The fix_amqp_settings() function is called once at the end of
296 271baf11 Nikos Skalkotos
   settings.py.dist, you must call it again if you change BACKEND_PREFIX_ID at
297 271baf11 Nikos Skalkotos
   some later point.
298 03353341 Vangelis Koukis
299 03353341 Vangelis Koukis
300 03353341 Vangelis Koukis
9. Installation of the Ganeti monitoring daemon, /ganeti/ganeti-eventd:
301 03353341 Vangelis Koukis
   The Ganeti monitoring daemon is part of the Django project and must run on
302 03353341 Vangelis Koukis
   GANETI-MASTER.
303 03353341 Vangelis Koukis
304 03353341 Vangelis Koukis
   Override all relevant settings in settings.py.dist, GANETI_* variables.
305 03353341 Vangelis Koukis
   Then start the server on the Ganeti master as root
306 03353341 Vangelis Koukis
307 03353341 Vangelis Koukis
     # cd synnefo && python ./ganeti/ganeti-eventd
308 03353341 Vangelis Koukis
309 03353341 Vangelis Koukis
   FIXME: The server must be started from the project root directory.
310 03353341 Vangelis Koukis
   TBD: how to handle master migration.
311 03353341 Vangelis Koukis
312 6ec8927b Vangelis Koukis
313 03353341 Vangelis Koukis
10. Installation of the Synnefo dispatcher, /logic/dispatcher.py:
314 03353341 Vangelis Koukis
    The logic dispatcher is part of the Synnefo Django project and must run
315 03353341 Vangelis Koukis
    on LOGIC nodes.
316 ff55193e Vangelis Koukis
317 271baf11 Nikos Skalkotos
    The dispatcher retrieves messages from the queue and calls the appropriate
318 271baf11 Nikos Skalkotos
    handler function as defined in the queue configuration in `setttings.py'.
319 271baf11 Nikos Skalkotos
    The default configuration should work directly without any modifications.
320 6ec8927b Vangelis Koukis
321 03353341 Vangelis Koukis
    For the time being The dispatcher must be run by hand:
322 03353341 Vangelis Koukis
      $ ./bin/python ./logic/dispatcher.py
323 6ec8927b Vangelis Koukis
324 03353341 Vangelis Koukis
    The dispatcher should run in at least 2 instances to ensure high
325 03353341 Vangelis Koukis
    (actually, increased) availability.
326 6ec8927b Vangelis Koukis
327 7e8b41e7 Vangelis Koukis
328 03353341 Vangelis Koukis
11. Installation of the Synnefo Ganeti hook:
329 03353341 Vangelis Koukis
    The Python script ganeti/snf-ganeti-hook.py is the generic launcher for
330 03353341 Vangelis Koukis
    Synnefo hooks in Ganeti.  It resides in the ganeti/ directory under the root
331 03353341 Vangelis Koukis
    of Synnefo Django project root.
332 7e8b41e7 Vangelis Koukis
333 271baf11 Nikos Skalkotos
    The hook needs to be enabled for phases post-{add,modify,reboot,start,stop}
334 271baf11 Nikos Skalkotos
    by *symlinking* in
335 271baf11 Nikos Skalkotos
    /etc/ganeti/hooks/instance-{add,modify,reboot,start,stop}-post.d on
336 271baf11 Nikos Skalkotos
    GANETI-MASTER, e.g.:
337 7e8b41e7 Vangelis Koukis
338 03353341 Vangelis Koukis
    root@ganeti-master:/etc/ganeti/hooks/instance-start-post.d# ls -l
339 03353341 Vangelis Koukis
    lrwxrwxrwx 1 root root 45 May   3 13:45 00-snf-ganeti-hook -> /home/devel/synnefo/ganeti/snf-ganeti-hook.py*
340 b6382dc5 Vangelis Koukis
341 03353341 Vangelis Koukis
    IMPORTANT: The link name may only contain "upper and lower case, digits,
342 03353341 Vangelis Koukis
    underscores and hyphens. In other words, the regexp ^[a-zA-Z0-9_-]+$."
343 271baf11 Nikos Skalkotos
    See:
344 271baf11 Nikos Skalkotos
     http://docs.ganeti.org/ganeti/master/html/hooks.html?highlight=hooks#naming
345 7e8b41e7 Vangelis Koukis
346 03353341 Vangelis Koukis
    The script uses the location of the link target to determine the Synnefo
347 03353341 Vangelis Koukis
    Project root, before passing control to the relevant Python code.
348 81d1a961 Constantinos Venetsanopoulos
349 03353341 Vangelis Koukis
    FIXME: Perhaps require a SYNNEFO_PROJECT_ROOT environment variable?
350 81d1a961 Constantinos Venetsanopoulos
351 81d1a961 Constantinos Venetsanopoulos
352 03353341 Vangelis Koukis
12. Installation of the VNC authentication proxy, vncauthproxy:
353 03353341 Vangelis Koukis
    To support OOB console access to the VMs over VNC, the vncauthproxy
354 03353341 Vangelis Koukis
    daemon must be running on every node of type APISERVER.
355 81d1a961 Constantinos Venetsanopoulos
356 03353341 Vangelis Koukis
    Download and install vncauthproxy from its own repository,
357 03353341 Vangelis Koukis
    at https://code.grnet.gr/git/vncauthproxy (known good commit: 8799ab6d6e).
358 03353341 Vangelis Koukis
359 03353341 Vangelis Koukis
    Edit default settings on top of vncauthproxy.py.
360 03353341 Vangelis Koukis
    Set CTRL_SOCKET in util/vapclient.py to point to its control socket.
361 81d1a961 Constantinos Venetsanopoulos
362 03353341 Vangelis Koukis
    FIXME: The CTRL_SOCKET setting will be moved to settings.py as
363 03353341 Vangelis Koukis
    VNCAUTHPROXY_CTRL_SOCKET.
364 a06deab3 Vangelis Koukis
365 03353341 Vangelis Koukis
    Create /var/log/vncauthproxy and set its permissions appropriately.
366 fc2afa67 Vangelis Koukis
367 fc2afa67 Vangelis Koukis
368 03353341 Vangelis Koukis
13. Installation of the customized Ganeti Instance Image for image deployment:
369 03353341 Vangelis Koukis
    For Synnefo to be able to launch VMs from specified Images, you need
370 03353341 Vangelis Koukis
    the gnt-instance-image OS Provider installed on the Ganeti backend.
371 03353341 Vangelis Koukis
372 03353341 Vangelis Koukis
    Download and install gnt-instance-image in all Ganeti nodes from its own
373 03353341 Vangelis Koukis
    repository, at https://code.grnet.gr/git/gnt-instance-image.
374 03353341 Vangelis Koukis
375 03353341 Vangelis Koukis
    After installing gnt-instance-image do the following:
376 271baf11 Nikos Skalkotos
    1. root@ganeti-master$ cd /path-to-repocp
377 271baf11 Nikos Skalkotos
       root@ganeti-master$ ./defaults /etc/default/ganeti-instance-image
378 03353341 Vangelis Koukis
    2. Uncomment the following in /etc/default/ganeti-instance-image:
379 271baf11 Nikos Skalkotos
         SWAP=no
380 271baf11 Nikos Skalkotos
         ARCH="x86_64"
381 271baf11 Nikos Skalkotos
    3. Add to /etc/default/ganeti-instance-image (so that make-dump makes no
382 271baf11 Nikos Skalkotos
       /boot partition):
383 271baf11 Nikos Skalkotos
         KERNEL_PATH="True"
384 03353341 Vangelis Koukis
    4. Change the path in make-dump line 22 according to your installation
385 03353341 Vangelis Koukis
       (/usr/share/ganeti/os/image/common.sh --> /srv/ganeti/os/image/common.sh)
386 271baf11 Nikos Skalkotos
    5. In common.sh, comment out the KERNEL_PATH variable initialization:
387 271baf11 Nikos Skalkotos
         #KERNEL_PATH="$INSTANCE_HV_kernel_path"
388 03353341 Vangelis Koukis
    6. In /etc/ganeti/instance-image/hooks, make sure the hooks you want to
389 03353341 Vangelis Koukis
       run during instance creation process have execute permission. At least
390 271baf11 Nikos Skalkotos
       `grub' and `root_passwd' should be triggered to make the instance usable:
391 03353341 Vangelis Koukis
         chmod +x /etc/ganeti/instance-image/hooks/{grub,root_passwd}
392 03353341 Vangelis Koukis
393 271baf11 Nikos Skalkotos
    Your Custom Images should be stored in a dump format under
394 271baf11 Nikos Skalkotos
    /var/cache/ganeti-instance-image and their filenames should have the
395 271baf11 Nikos Skalkotos
    following format:
396 03353341 Vangelis Koukis
      {backend_id}-x86_64-root.dump
397 03353341 Vangelis Koukis
    e.g., debian-6.0.1a-x86_64-root.dump (backend_id = "debian-6.0.1a")
398 76a429fb Georgios Gousios
399 76a429fb Georgios Gousios
400 03353341 Vangelis Koukis
14. Setup Synnefo-specific networking on the Ganeti backend:
401 03353341 Vangelis Koukis
    This part is deployment-specific and must be customized based on the
402 03353341 Vangelis Koukis
    specific needs of the system administrators.
403 76a429fb Georgios Gousios
404 03353341 Vangelis Koukis
    A reference installation will use a Synnefo-specific KVM ifup script,
405 03353341 Vangelis Koukis
    NFDHCPD and pre-provisioned Linux bridges to support public and private
406 03353341 Vangelis Koukis
    network functionality. For this:
407 76a429fb Georgios Gousios
408 03353341 Vangelis Koukis
    Grab NFDHCPD from its own repository (https://code.grnet.gr/git/nfdhcpd),
409 03353341 Vangelis Koukis
    install it, modify /etc/nfdhcpd/nfdhcpd.conf to reflect your network
410 03353341 Vangelis Koukis
    configuration.
411 76a429fb Georgios Gousios
412 03353341 Vangelis Koukis
    Install a custom KVM ifup script for use by Ganeti, as
413 03353341 Vangelis Koukis
    /etc/ganeti/kvm-vif-bridge, on GANETI-NODEs. A sample implementation is
414 03353341 Vangelis Koukis
    provided under /contrib/ganeti-hooks. Set NFDHCPD_STATE_DIR to point
415 03353341 Vangelis Koukis
    to NFDHCPD's state directory, usually /var/lib/nfdhcpd.
416 76a429fb Georgios Gousios
417 76a429fb Georgios Gousios
418 03353341 Vangelis Koukis
15. Create log file directories for Synnefo components, set appropriate
419 03353341 Vangelis Koukis
    permissions. By default, logic/dispatcher.py and ganeti/ganeti-eventd.py
420 03353341 Vangelis Koukis
    use /var/log/synnefo.
421 76a429fb Georgios Gousios
422 7e8b41e7 Vangelis Koukis
423 03353341 Vangelis Koukis
16. (Hopefully) Done