Statistics
| Branch: | Tag: | Revision:

root / docs / admin-guide.rst @ a69ad12b

History | View | Annotate | Download (66.2 kB)

1
.. _admin-guide:
2

    
3
Synnefo Administrator's Guide
4
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
5

    
6
This is the complete Synnefo Administrator's Guide.
7

    
8

    
9
.. _syn+archip:
10

    
11
General Synnefo Architecture
12
============================
13

    
14
The following figure shows a detailed view of the whole Synnefo architecture
15
and how it interacts with multiple Ganeti clusters. We hope that after reading
16
the Administrator's Guide you will be able to understand every component and
17
all the interactions between them.
18

    
19
.. image:: images/synnefo-arch2.png
20
   :width: 100%
21
   :target: _images/synnefo-arch2.png
22

    
23
Synnefo also supports RADOS as an alternative storage backend for
24
Files/Images/VM disks. You will find the :ref:`corresponding figure
25
<syn+archip+rados>` later in this guide.
26

    
27

    
28
Identity Service (Astakos)
29
==========================
30

    
31

    
32
Authentication methods
33
----------------------
34

    
35
Astakos supports multiple authentication methods:
36

    
37
 * local username/password
38
 * LDAP / Active Directory
39
 * SAML 2.0 (Shibboleth) federated logins
40
 * Google
41
 * Twitter
42
 * LinkedIn
43

    
44
.. _shibboleth-auth:
45

    
46
Shibboleth Authentication
47
~~~~~~~~~~~~~~~~~~~~~~~~~
48

    
49
Astakos can delegate user authentication to a Shibboleth federation.
50

    
51
To setup shibboleth, install package::
52

    
53
  apt-get install libapache2-mod-shib2
54

    
55
Change appropriately the configuration files in ``/etc/shibboleth``.
56

    
57
Add in ``/etc/apache2/sites-available/synnefo-ssl``::
58

    
59
  ShibConfig /etc/shibboleth/shibboleth2.xml
60
  Alias      /shibboleth-sp /usr/share/shibboleth
61

    
62
  <Location /ui/login/shibboleth>
63
    AuthType shibboleth
64
    ShibRequireSession On
65
    ShibUseHeaders On
66
    require valid-user
67
  </Location>
68

    
69
and before the line containing::
70

    
71
  ProxyPass        / http://localhost:8080/ retry=0
72

    
73
add::
74

    
75
  ProxyPass /Shibboleth.sso !
76

    
77
Then, enable the shibboleth module::
78

    
79
  a2enmod shib2
80

    
81
After passing through the apache module, the following tokens should be
82
available at the destination::
83

    
84
  eppn # eduPersonPrincipalName
85
  Shib-InetOrgPerson-givenName
86
  Shib-Person-surname
87
  Shib-Person-commonName
88
  Shib-InetOrgPerson-displayName
89
  Shib-EP-Affiliation
90
  Shib-Session-ID
91

    
92
Finally, add 'shibboleth' in ``ASTAKOS_IM_MODULES`` list. The variable resides
93
inside the file ``/etc/synnefo/20-snf-astakos-app-settings.conf``
94

    
95
Twitter Authentication
96
~~~~~~~~~~~~~~~~~~~~~~
97

    
98
To enable twitter authentication while signed in under a Twitter account,
99
visit dev.twitter.com/apps.
100

    
101
Click Create an application.
102

    
103
Fill the necessary information and for callback URL give::
104

    
105
    https://node1.example.com/ui/login/twitter/authenticated
106

    
107
Finally, add 'twitter' in ``ASTAKOS_IM_MODULES`` list. The variable resides
108
inside the file ``/etc/synnefo/20-snf-astakos-app-settings.conf``
109

    
110
Google Authentication
111
~~~~~~~~~~~~~~~~~~~~~
112

    
113
To enable google authentication while signed in under a Google account,
114
visit https://code.google.com/apis/console/.
115

    
116
Under API Access select Create another client ID, select Web application,
117
expand more options in Your site or hostname section and in Authorized
118
Redirect URIs add:
119

    
120

    
121
Fill the necessary information and for callback URL give::
122

    
123
    https://node1.example.com/ui/login/google/authenticated
124

    
125
Finally, add 'google' in ``ASTAKOS_IM_MODULES`` list. The variable resides
126
inside the file ``/etc/synnefo/20-snf-astakos-app-settings.conf``
127

    
128

    
129
Working with Astakos
130
--------------------
131

    
132
User registration
133
~~~~~~~~~~~~~~~~~
134

    
135
When a new user signs up, he/she is not directly marked as active. You can see 
136
his/her state by running (on the machine that runs the Astakos app):
137

    
138
.. code-block:: console
139

    
140
   $ snf-manage user-list
141

    
142
More detailed user status is provided in the `status` field of the `user-show` 
143
command:
144

    
145
.. code-block:: console
146

    
147
  $ snf-manage user-show <user-id>
148

    
149
  id                  : 6
150
  uuid                : 78661411-5eed-412f-a9ea-2de24f542c2e
151
  status              : Accepted/Active (accepted policy: manual)
152
  email               : user@synnefo.org
153
  ....
154

    
155
Based on the `astakos-app` configuration, there are several ways for a user to
156
get verified and activated in order to be able to login. We discuss the user
157
verification and activation flow in the following section.
158

    
159
User activation flow
160
````````````````````
161

    
162
A user can register for an account using the astakos signup form. Once the form
163
is submited successfully a user entry is created in astakos database. That entry
164
is passed through the astakos activation backend which handles whether the user
165
should be automatically verified and activated.
166

    
167
Email verification
168
``````````````````
169

    
170
The verification process takes place in order to ensure that the user owns the
171
email provided during the signup process. By default, after each successful
172
signup astakos notifies user with an verification url via email. 
173

    
174
At this stage:
175

    
176
    * subsequent registrations invalidate and delete the previous registrations 
177
      of the same email address.
178

    
179
    * in case user misses the initial notification, additional emails can be
180
      send either via the url which is prompted to the user if he tries to
181
      login, or by the administrator using the ``snf-manage user-activation-send
182
      <userid>`` command.
183

    
184
    * administrator may also enforce a user to get verified using the
185
      ``snf-manage user-modify --verify <userid>`` command.
186

    
187
Account activation
188
``````````````````
189

    
190
Once the user gets verified, it is time for Astakos to decide whether or not to
191
proceed through user activation process. If ``ASTAKOS_MODERATION_ENABLED``
192
setting is set to ``False`` (default value) user gets activated automatically. 
193

    
194
In case the moderation is enabled Astakos may still automatically activate the
195
user in the following cases:
196

    
197
    * User email matches any of the regular expressions defined in
198
      ``ASTAKOS_RE_USER_EMAIL_PATTERNS`` (defaults to ``[]``)
199
    * User used a signup method (e.g. ``shibboleth``) for which automatic
200
      activation is enabled (see 
201
      :ref:`authentication methods policies <auth_methods_policies>`).
202

    
203
If all of the above fail to trigger automatic activation, an email is sent to
204
the persons listed in ``HELPDESK``, ``MANAGERS`` and ``ADMINS`` settings,
205
notifing that there is a new user pending for moderation and that it's up to
206
the administrator to decide if the user should be activated. The UI also shows
207
a corresponding 'pending moderation' message to the user. The administrator can
208
activate a user using the ``snf-manage user-modify`` command:
209

    
210
.. code-block:: console
211

    
212
    # command to activate a pending user
213
    $ snf-manage user-modify --accept <userid>
214

    
215
    # command to reject a pending user
216
    $ snf-manage user-modify --reject --reject-reason="spammer" <userid>
217

    
218
Once the activation process finishes, a greeting message is sent to the user
219
email address and a notification for the activation to the persons listed in
220
``HELPDESK``, ``MANAGERS`` and ``ADMINS`` settings. Once activated the user is
221
able to login and access the Synnefo services.
222

    
223
Additional authentication methods
224
`````````````````````````````````
225

    
226
Astakos supports third party logins from external identity providers. This
227
can be usefull since it allows users to use their existing credentials to 
228
login to astakos service.
229

    
230
Currently astakos supports the following identity providers:
231

    
232
    * `Shibboleth <http://www.internet2.edu/shibboleth>`_ (module name
233
      ``shibboleth``)
234
    * `Google <https://developers.google.com/accounts/docs/OAuth2>`_ (module
235
      name ``google``)
236
    * `Twitter <https://dev.twitter.com/docs/auth>`_ (module name ``twitter``)
237
    * `LinkedIn <http://developer.linkedin.com/documents/authentication>`_
238
      (module name ``linkedin``)
239

    
240
To enable any of the above modules (by default only ``local`` accounts are
241
allowed), retrieve and set the required provider settings and append the 
242
module name in ``ASTAKOS_IM_MODULES``.
243

    
244
.. code-block:: python
245

    
246
    # settings from https://code.google.com/apis/console/
247
    ASTAKOS_GOOGLE_CLIENT_ID = '1111111111-epi60tvimgha63qqnjo40cljkojcann3.apps.googleusercontent.com'
248
    ASTAKOS_GOOGLE_SECRET = 'tNDQqTDKlTf7_LaeUcWTWwZM'
249
    
250
    # let users signup and login using their google account
251
    ASTAKOS_IM_MODULES = ['local', 'google']
252

    
253

    
254
.. _auth_methods_policies:
255

    
256
Authentication method policies
257
``````````````````````````````
258

    
259
Astakos allows you to override the default policies for each enabled provider 
260
separately by adding the approriate settings in your ``.conf`` files in the 
261
following format:
262

    
263
**ASTAKOS_AUTH_PROVIDER_<module>_<policy>_POLICY**
264

    
265
Available policies are:
266

    
267
    * **CREATE** Users can signup using that provider (default: ``True``) 
268
    * **REMOVE/ADD** Users can remove/add login method from their profile 
269
      (default: ``True``)
270
    * **AUTOMODERATE** Automatically activate users that signup using that
271
      provider (default: ``False``)
272
    * **LOGIN** Whether or not users can use the provider to login (default:
273
      ``True``).
274

    
275
e.g. to enable automatic activation for your academic users, while keeping 
276
locally signed up users under moderation you can apply the following settings.
277

    
278
.. code-block:: python
279

    
280
    ASTAKOS_AUTH_PROVIDER_SHIBBOLETH_AUTOMODERATE_POLICY = True
281
    ASTAKOS_AUTH_PROVIDER_SHIBBOLETH_REMOVE_POLICY = False
282

    
283
User login
284
~~~~~~~~~~
285

    
286
During the logging procedure, the user is authenticated by the respective
287
identity provider.
288

    
289
If ``ASTAKOS_RECAPTCHA_ENABLED`` is set and the user fails several times
290
(``ASTAKOS_RATELIMIT_RETRIES_ALLOWED`` setting) to provide the correct
291
credentials for a local account, he/she is then prompted to solve a captcha
292
challenge.
293

    
294
Upon success, the system renews the token (if it has expired), logins the user
295
and sets the cookie, before redirecting the user to the ``next`` parameter
296
value.
297

    
298
Setting quota limits
299
~~~~~~~~~~~~~~~~~~~~
300

    
301
Set default quota
302
`````````````````
303
To inspect current default base quota limits, run::
304

    
305
   # snf-manage resource-list
306

    
307
You can modify the default base quota limit for all future users with::
308

    
309
   # snf-manage resource-modify <resource_name> --default-quota <value>
310

    
311
Set base quota for individual users
312
```````````````````````````````````
313

    
314
For individual users that need different quota than the default
315
you can set it for each resource like this::
316

    
317
    # use this to display quota / uuid
318
    # snf-manage user-show 'uuid or email' --quota
319

    
320
    # snf-manage user-modify 'user-uuid' --set-base-quota 'cyclades.vm' 10
321

    
322

    
323
Enable the Projects feature
324
~~~~~~~~~~~~~~~~~~~~~~~~~~~
325

    
326
If you want to enable the projects feature so that users may apply
327
on their own for resources by creating and joining projects,
328
in ``20-snf-astakos-app-settings.conf`` set::
329

    
330
    # this will make the 'projects' page visible in the dashboard
331
    ASTAKOS_PROJECTS_VISIBLE = True
332

    
333
You can change the maximum allowed number of pending project applications
334
per user with::
335

    
336
    # snf-manage resource-modify astakos.pending_app --default-quota <number>
337

    
338
You can also set a user-specific limit with::
339

    
340
    # snf-manage user-modify 'user-uuid' --set-base-quota 'astakos.pending_app' 5
341

    
342
When users apply for projects they are not automatically granted
343
the resources. They must first be approved by the administrator.
344

    
345
To list pending project applications in astakos::
346

    
347
    # snf-manage project-list --pending
348

    
349
Note the last column, the application id. To approve it::
350

    
351
    # <app id> from the last column of project-list
352
    # snf-manage project-control --approve <app id>
353

    
354
To deny an application::
355

    
356
    # snf-manage project-control --deny <app id>
357

    
358
Users designated as *project admins* can approve, deny, or modify
359
an application through the web interface. In
360
``20-snf-astakos-app-settings.conf`` set::
361

    
362
    # UUIDs of users that can approve or deny project applications from the web.
363
    ASTAKOS_PROJECT_ADMINS = [<uuid>, ...]
364

    
365

    
366
Astakos advanced operations
367
---------------------------
368

    
369
Adding "Terms of Use"
370
~~~~~~~~~~~~~~~~~~~~~
371

    
372
Astakos supports versioned terms-of-use. First of all you need to create an
373
html file that will contain your terms. For example, create the file
374
``/usr/share/synnefo/sample-terms.html``, which contains the following:
375

    
376
.. code-block:: console
377

    
378
   <h1>My cloud service terms</h1>
379

    
380
   These are the example terms for my cloud service
381

    
382
Then, add those terms-of-use with the snf-manage command:
383

    
384
.. code-block:: console
385

    
386
   $ snf-manage term-add /usr/share/synnefo/sample-terms.html
387

    
388
Your terms have been successfully added and you will see the corresponding link
389
appearing in the Astakos web pages' footer.
390

    
391
During the account registration, if there are approval terms, the user is
392
presented with an "I agree with the Terms" checkbox that needs to get checked
393
in order to proceed.
394

    
395
In case there are new approval terms that the user has not signed yet, the
396
``signed_terms_required`` view decorator redirects to the ``approval_terms``
397
view, so the user will be presented with the new terms the next time he/she
398
logins.
399

    
400
Enabling reCAPTCHA
401
~~~~~~~~~~~~~~~~~~
402

    
403
Astakos supports the `reCAPTCHA <http://www.google.com/recaptcha>`_ feature.
404
If enabled, it protects the Astakos forms from bots. To enable the feature, go
405
to https://www.google.com/recaptcha/admin/create and create your own reCAPTCHA
406
key pair. Then edit ``/etc/synnefo/20-snf-astakos-app-settings.conf`` and set
407
the corresponding variables to reflect your newly created key pair. Finally, set
408
the ``ASTAKOS_RECAPTCHA_ENABLED`` variable to ``True``:
409

    
410
.. code-block:: console
411

    
412
   ASTAKOS_RECAPTCHA_PUBLIC_KEY = 'example_recaptcha_public_key!@#$%^&*('
413
   ASTAKOS_RECAPTCHA_PRIVATE_KEY = 'example_recaptcha_private_key!@#$%^&*('
414

    
415
   ASTAKOS_RECAPTCHA_ENABLED = True
416

    
417
Restart the service on the Astakos node(s) and you are ready:
418

    
419
.. code-block:: console
420

    
421
   # /etc/init.d/gunicorn restart
422

    
423
Checkout your new Sign up page. If you see the reCAPTCHA box, you have setup
424
everything correctly.
425

    
426

    
427
Astakos internals
428
-----------------
429

    
430
X-Auth-Token
431
~~~~~~~~~~~~
432

    
433
Alice requests a specific resource from a cloud service e.g.: Pithos. In the
434
request she supplies the `X-Auth-Token` to identify whether she is eligible to
435
perform the specific task. The service contacts Astakos through its
436
``/account/v1.0/authenticate`` api call (see :ref:`authenticate-api-label`)
437
providing the specific ``X-Auth-Token``. Astakos checkes whether the token
438
belongs to an active user and it has not expired and returns a dictionary
439
containing user related information. Finally the service uses the ``uniq``
440
field included in the dictionary as the account string to identify the user
441
accessible resources.
442

    
443
.. _authentication-label:
444

    
445
Django Auth methods and Backends
446
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
447

    
448
Astakos incorporates Django user authentication system and extends its User model.
449

    
450
Since username field of django User model has a limitation of 30 characters,
451
AstakosUser is **uniquely** identified by the ``email`` instead. Therefore,
452
``astakos.im.authentication_backends.EmailBackend`` is served to authenticate a
453
user using email if the first argument is actually an email, otherwise tries
454
the username.
455

    
456
A new AstakosUser instance is assigned with a uui as username and also with a
457
``auth_token`` used by the cloud services to authenticate the user.
458
``astakos.im.authentication_backends.TokenBackend`` is also specified in order
459
to authenticate the user using the email and the token fields.
460

    
461
Logged on users can perform a number of actions:
462

    
463
 * access and edit their profile via: ``/im/profile``.
464
 * change their password via: ``/im/password``
465
 * send feedback for grnet services via: ``/im/send_feedback``
466
 * logout (and delete cookie) via: ``/im/logout``
467

    
468
Internal Astakos requests are handled using cookie-based Django user sessions.
469

    
470
External systems should forward to the ``/login`` URI. The server,
471
depending on its configuration will redirect to the appropriate login page.
472
When done with logging in, the service's login URI should redirect to the URI
473
provided with next, adding user and token parameters, which contain the email
474
and token fields respectively.
475

    
476
The login URI accepts the following parameters:
477

    
478
======================  =========================
479
Request Parameter Name  Value
480
======================  =========================
481
next                    The URI to redirect to when the process is finished
482
renew                   Force token renewal (no value parameter)
483
force                   Force logout current user (no value parameter)
484
======================  =========================
485

    
486
External systems inside the ``ASTAKOS_COOKIE_DOMAIN`` scope can acquire the
487
user information by the cookie identified by ``ASTAKOS_COOKIE_NAME`` setting
488
(set during the login procedure).
489

    
490
Finally, backend systems having acquired a token can use the
491
:ref:`authenticate-api-label` API call from a private network or through HTTPS.
492

    
493

    
494
Compute/Network/Image Service (Cyclades)
495
========================================
496

    
497
Working with Cyclades
498
---------------------
499

    
500
Managing Ganeti Backends
501
~~~~~~~~~~~~~~~~~~~~~~~~
502

    
503
Since v0.11, Synnefo is able to manage multiple Ganeti clusters (backends)
504
making it capable to scale linearly to tens of thousands of VMs. Backends
505
can be dynamically added or removed via `snf-manage` commands.
506

    
507
Each newly created VM is allocated to a Ganeti backend by the Cyclades backend
508
allocator. The VM is "pinned" to this backend, and can not change through its
509
lifetime. The backend allocator decides in which backend to spawn the VM based
510
on the available resources of each backend, trying to balance the load between
511
them.
512

    
513
Handling of Networks, as far as backends are concerned, is based on whether the
514
network is public or not. Public networks are created through the `snf-manage
515
network-create` command, and are only created on one backend. Private networks
516
are created on all backends, in order to ensure that VMs residing on different
517
backends can be connected to the same private network.
518

    
519
Listing existing backends
520
`````````````````````````
521
To list all the Ganeti backends known to Synnefo, we run:
522

    
523
.. code-block:: console
524

    
525
   $ snf-manage backend-list
526

    
527
Adding a new Ganeti backend
528
```````````````````````````
529
Backends are dynamically added under the control of Synnefo with `snf-manage
530
backend-add` command. In this section it is assumed that a Ganeti cluster,
531
named ``cluster.example.com`` is already up and running and configured to be
532
able to host Synnefo VMs.
533

    
534
To add this Ganeti cluster, we run:
535

    
536
.. code-block:: console
537

    
538
   $ snf-manage backend-add --clustername=cluster.example.com --user="synnefo_user" --pass="synnefo_pass"
539

    
540
where ``clustername`` is the Cluster hostname of the Ganeti cluster, and
541
``user`` and ``pass`` are the credentials for the `Ganeti RAPI user
542
<http://docs.ganeti.org/ganeti/2.2/html/rapi.html#users-and-passwords>`_.  All
543
backend attributes can be also changed dynamically using the `snf-manage
544
backend-modify` command.
545

    
546
``snf-manage backend-add`` will also create all existing private networks to
547
the new backend. You can verify that the backend is added, by running
548
`snf-manage backend-list`.
549

    
550
Note that no VMs will be spawned to this backend, since by default it is in a
551
``drained`` state after addition and also it has no public network assigned to
552
it.
553

    
554
So, first you need to create its public network, make sure everything works as
555
expected and finally make it active by un-setting the ``drained`` flag. You can
556
do this by running:
557

    
558
.. code-block:: console
559

    
560
   $ snf-manage backend-modify --drained=False <backend_id>
561

    
562
Removing an existing Ganeti backend
563
```````````````````````````````````
564
In order to remove an existing backend from Synnefo, we run:
565

    
566
.. code-block:: console
567

    
568
   # snf-manage backend-remove <backend_id>
569

    
570
This command will fail if there are active VMs on the backend. Also, the
571
backend is not cleaned before removal, so all the Synnefo private networks
572
will be left on the Ganeti nodes. You need to remove them manually.
573

    
574
Allocation of VMs in Ganeti backends
575
````````````````````````````````````
576
As already mentioned, the Cyclades backend allocator is responsible for
577
allocating new VMs to backends. This allocator does not choose the exact Ganeti
578
node that will host the VM but just the Ganeti backend. The exact node is
579
chosen by the Ganeti cluster's allocator (hail).
580

    
581
The decision about which backend will host a VM is based on the available
582
resources. The allocator computes a score for each backend, that shows its load
583
factor, and the one with the minimum score is chosen. The admin can exclude
584
backends from the allocation phase by marking them as ``drained`` by running:
585

    
586
.. code-block:: console
587

    
588
   $ snf-manage backend-modify --drained=True <backend_id>
589

    
590
The backend resources are periodically updated, at a period defined by
591
the ``BACKEND_REFRESH_MIN`` setting, or by running `snf-manage backend-update-status`
592
command. It is advised to have a cron job running this command at a smaller
593
interval than ``BACKEND_REFRESH_MIN`` in order to remove the load of refreshing
594
the backends stats from the VM creation phase.
595

    
596
Finally, the admin can decide to have a user's VMs being allocated to a
597
specific backend, with the ``BACKEND_PER_USER`` setting. This is a mapping
598
between users and backends. If the user is found in ``BACKEND_PER_USER``, then
599
Synnefo allocates all his/hers VMs to the specific backend in the variable,
600
even if is marked as drained (useful for testing).
601

    
602
Allocation based on disk-templates
603
**********************************
604

    
605
Besides the available resources of each Ganeti backend, the allocator takes
606
into consideration the disk template of the instance when trying to allocate it
607
to a Ganeti backend. Specifically, the allocator checks if the flavor of the
608
instance belongs to the available disk templates of each Ganeti backend.
609

    
610
A Ganeti cluster has a list of enabled disk templates
611
(`--enabled-disk-templates`) and a list of allowed disk templates for new
612
instances (`--ipolicy-disk-templates`). See the `gnt-cluster` manpage for more
613
details about these options.
614

    
615
When Synnefo allocates an instance, it checks whether the disk template of the
616
new instance belongs both in the enabled and ipolicy disk templates. You can
617
see the list of the available disk-templates by running `snf-manage
618
backend-list`. This list should be updated automatically after changing
619
these options in Ganeti and it can also be updated by running `snf-manage
620
backend-update-status`.
621

    
622
So the administrator, can route instances on different backends based on their
623
flavor disk template, by modifying the enabled or ipolicy disk templates of
624
each backend.  Also, the administrator can route instances between different
625
nodes of the same Ganeti backend, by modifying the same options at the
626
nodegroup level (see `gnt-group` manpage for mor details).
627

    
628

    
629
Managing Virtual Machines
630
~~~~~~~~~~~~~~~~~~~~~~~~~
631

    
632
As mentioned, Cyclades uses Ganeti for management of VMs. The administrator can
633
handle Cyclades VMs just like any other Ganeti instance, via `gnt-instance`
634
commands. All Ganeti instances that belong to Synnefo, are separated from
635
others, by a prefix in their names. This prefix is defined in
636
``BACKEND_PREFIX_ID`` setting in
637
``/etc/synnefo/20-snf-cyclades-app-backend.conf``.
638

    
639
Apart from handling instances directly in the Ganeti level, a number of `snf-manage`
640
commands are available:
641

    
642
* ``snf-manage server-list``: List servers
643
* ``snf-manage server-show``: Show information about a server in the Cyclades DB
644
* ``snf-manage server-inspect``: Inspect the state of a server both in DB and Ganeti
645
* ``snf-manage server-modify``: Modify the state of a server in the Cycldes DB
646
* ``snf-manage server-create``: Create a new server
647
* ``snf-manage server-import``: Import an existing Ganeti instance to Cyclades
648

    
649

    
650
Managing Virtual Networks
651
~~~~~~~~~~~~~~~~~~~~~~~~~
652

    
653
Cyclades is able to create and manage Virtual Networks. Networking is
654
desployment specific and must be customized based on the specific needs of the
655
system administrator. For better understanding of networking please refer to
656
the :ref:`Network <networks>` section.
657

    
658
Exactly as Cyclades VMs can be handled like Ganeti instances, Cyclades Networks
659
can also by handled as Ganeti networks, via `gnt-network commands`. All Ganeti
660
networks that belong to Synnefo are named with the prefix
661
`${BACKEND_PREFIX_ID}-net-`.
662

    
663
There are also the following `snf-manage` commands for managing networks:
664

    
665
* ``snf-manage network-list``: List networks
666
* ``snf-manage network-show``: Show information about a network in the Cyclades DB
667
* ``snf-manage network-inspect``: Inspect the state of the network in DB and Ganeti backends
668
* ``snf-manage network-modify``: Modify the state of a network in the Cycldes DB
669
* ``snf-manage network-create``: Create a new network
670
* ``snf-manage network-remove``: Remove an existing network
671

    
672
Managing Network Resources
673
``````````````````````````
674

    
675
Proper operation of the Cyclades Network Service depends on the unique
676
assignment of specific resources to each type of virtual network. Specifically,
677
these resources are:
678

    
679
* IP addresses. Cyclades creates a Pool of IPs for each Network, and assigns a
680
  unique IP address to each VM, thus connecting it to this Network. You can see
681
  the IP pool of each network by running `snf-manage network-inspect
682
  <network_ID>`. IP pools are automatically created and managed by Cyclades,
683
  depending on the subnet of the Network.
684
* Bridges corresponding to physical VLANs, which are required for networks of
685
  type `PRIVATE_PHYSICAL_VLAN`.
686
* One Bridge corresponding to one physical VLAN which is required for networks of
687
  type `PRIVATE_MAC_PREFIX`.
688

    
689
IPv4 addresses
690
**************
691

    
692
An allocation pool of IPv4 addresses is automatically created for every network
693
that has the attribute `dhcp` set to True. The allocation pool contains the
694
range of IP addresses that are included in the subnet. The gateway and the
695
broadcast address of the network are excluded from the allocation pool. The
696
admin can externally reserve IP addresses to exclude them from automatic
697
allocation with the `--add-reserved-ips` option of `snf-manage network-modify`
698
command. For example the following command will reserve two IP addresses
699
from network with ID `42`:
700

    
701
.. code-block:: console
702

    
703
 snf-manage network-modify --add-reserved-ips=10.0.0.21,10.0.0.22 42
704

    
705
.. warning:: Externally reserving IP addresses is also available at the Ganeti.
706
 However, when using Cyclades with multiple Ganeti backends, the handling of
707
 IP pools must be performed from Cyclades!
708

    
709
Bridges
710
*******
711

    
712
As already mentioned Cyclades use a pool of Bridges that must correspond
713
to Physical VLAN at the Ganeti level. A bridge from the pool is assigned to
714
each network of flavor `PHYSICAL_VLAN`. Creation of this pool is done
715
using `snf-manage pool-create` command. For example the following command
716
will create a pool containing the brdiges from `prv1` to `prv21`.
717

    
718
.. code-block:: console
719

    
720
   # snf-manage pool-create --type=bridge --base=prv --size=20
721

    
722
You can verify the creation of the pool, and check its contents by running:
723

    
724
.. code-block:: console
725

    
726
   # snf-manage pool-list
727
   # snf-manage pool-show --type=bridge 1
728

    
729
Finally you can use the `pool-modify` management command in order to externally
730
reserve the values from pool, extend or shrink the pool if possible.
731

    
732
MAC Prefixes
733
************
734

    
735
Cyclades also use a pool of MAC prefixes to assign to networks of flavor
736
`MAC_FILTERED`. Handling of this pool is done exactly as with pool of bridges,
737
except that the type option must be set to mac-prefix:
738

    
739
.. code-block:: console
740

    
741
   # snf-manage pool-create --type=mac-prefix --base=aa:00:0 --size=65536
742

    
743
The above command will create a pool of MAC prefixes from ``aa:00:1`` to
744
``b9:ff:f``. The MAC prefix pool is responsible for providing only unicast and
745
locally administered MAC addresses, so many of these prefixes will be
746
externally reserved, to exclude from allocation.
747

    
748
Pool reconciliation
749
*******************
750

    
751
The management command `snf-manage reconcile-pools` can be used that all the
752
above mentioned pools are consistent and that all values that come from the
753
pool are not used more than once.
754

    
755

    
756
Cyclades advanced operations
757
----------------------------
758

    
759
Reconciliation mechanism
760
~~~~~~~~~~~~~~~~~~~~~~~~
761

    
762
On certain occasions, such as a Ganeti or RabbitMQ failure, the state of
763
Cyclades database may differ from the real state of VMs and networks in the
764
Ganeti backends. The reconciliation process is designed to synchronize
765
the state of the Cyclades DB with Ganeti. There are two management commands
766
for reconciling VMs and Networks
767

    
768
Reconciling Virtual Machines
769
````````````````````````````
770

    
771
Reconciliation of VMs detects the following conditions:
772

    
773
 * Stale DB servers without corresponding Ganeti instances
774
 * Orphan Ganeti instances, without corresponding DB entries
775
 * Out-of-sync state for DB entries wrt to Ganeti instances
776

    
777
To detect all inconsistencies you can just run:
778

    
779
.. code-block:: console
780

    
781
  $ snf-manage reconcile-servers
782

    
783
Adding the `--fix-all` option, will do the actual synchronization:
784

    
785
.. code-block:: console
786

    
787
  $ snf-manage reconcile-servers --fix-all
788

    
789
Please see ``snf-manage reconcile-servers --help`` for all the details.
790

    
791
Reconciling Networks
792
````````````````````
793

    
794
Reconciliation of Networks detects the following conditions:
795

    
796
  * Stale DB networks without corresponding Ganeti networks
797
  * Orphan Ganeti networks, without corresponding DB entries
798
  * Private networks that are not created to all Ganeti backends
799
  * Unsynchronized IP pools
800

    
801
To detect all inconsistencies you can just run:
802

    
803
.. code-block:: console
804

    
805
  $ snf-manage reconcile-networks
806

    
807
Adding the `--fix-all` option, will do the actual synchronization:
808

    
809
.. code-block:: console
810

    
811
  $ snf-manage reconcile-networks --fix-all
812

    
813
Please see ``snf-manage reconcile-networks --help`` for all the details.
814

    
815

    
816
Cyclades internals
817
------------------
818

    
819
Asynchronous communication with Ganeti backends
820
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
821
Synnefo uses Google Ganeti backends for VM cluster management. In order for
822
Cyclades to be able to handle thousands of user requests, Cyclades and Ganeti
823
communicate asynchronously. Briefly, requests are submitted to Ganeti through
824
Ganeti's RAPI/HTTP interface, and then asynchronous notifications about the
825
progress of Ganeti jobs are being created and pushed upwards to Cyclades. The
826
architecture and communication with a Ganeti backend is shown in the graph
827
below:
828

    
829
.. image:: images/cyclades-ganeti-communication.png
830
   :width: 50%
831
   :target: _images/cyclades-ganeti-communication.png
832

    
833
The Cyclades API server is responsible for handling user requests. Read-only
834
requests are directly served by looking up the Cyclades DB. If the request
835
needs an action in the Ganeti backend, Cyclades submit jobs to the Ganeti
836
master using the `Ganeti RAPI interface
837
<http://docs.ganeti.org/ganeti/2.2/html/rapi.html>`_.
838

    
839
While Ganeti executes the job, `snf-ganeti-eventd`, `snf-ganeti-hook` and
840
`snf-progress-monitor` are monitoring the progress of the job and send
841
corresponding messages to the RabbitMQ servers. These components are part
842
of `snf-cyclades-gtools` and must be installed on all Ganeti nodes. Specially:
843

    
844
* *snf-ganeti-eventd* sends messages about operations affecting the operating
845
  state of instances and networks. Works by monitoring the Ganeti job queue.
846
* *snf-ganeti_hook* sends messages about the NICs of instances. It includes a
847
  number of `Ganeti hooks <http://docs.ganeti.org/ganeti/2.2/html/hooks.html>`_
848
  for customisation of operations.
849
* *snf-progress_monitor* sends messages about the progress of the Image deployment
850
  phase which is done by the Ganeti OS Definition `snf-image`.
851

    
852
Finally, `snf-dispatcher` consumes messages from the RabbitMQ queues, processes
853
these messages and properly updates the state of the Cyclades DB. Subsequent
854
requests to the Cyclades API, will retrieve the updated state from the DB.
855

    
856

    
857
Synnefo management commands ("snf-manage")
858
==========================================
859

    
860
Each Synnefo service, Astakos, Pithos and Cyclades are controlled by the
861
administrator using the "snf-manage" admin tool. This tool is an extension of
862
the Django command-line management utility. It is run on the host that runs
863
each service and provides different types of commands depending the services
864
running on the host. If you are running more than one service on the same host
865
"snf-manage" adds all the corresponding commands for each service dynamically,
866
providing a unified admin environment.
867

    
868
To run "snf-manage" you just type:
869

    
870
.. code-block:: console
871

    
872
   # snf-manage <command> [arguments]
873

    
874
on the corresponding host that runs the service. For example, if you have all
875
services running on different physical hosts you would do:
876

    
877
.. code-block:: console
878

    
879
   root@astakos-host # snf-manage <astakos-command> [argument]
880
   root@pithos-host # snf-manage <pithos-command> [argument]
881
   root@cyclades-host # snf-manage <cyclades-command> [argument]
882

    
883
If you have all services running on the same host you would do:
884

    
885
.. code-block:: console
886

    
887
   root@synnefo-host # snf-manage <{astakos,pithos,cyclades}-command> [argument]
888

    
889
Note that you cannot execute a service's command on a host that is not running
890
this service. For example, the following will return an error if Astakos and
891
Cyclades are installed on different physical hosts:
892

    
893
.. code-block:: console
894

    
895
   root@astakos-host # snf-manage <cyclades-command> [argument]
896
   Unknown command: 'cyclades-command'
897
   Type 'snf-manage help' for usage.
898

    
899
This is the complete list of "snf-manage" commands for each service.
900

    
901
Astakos snf-manage commands
902
---------------------------
903

    
904
============================  ===========================
905
Name                          Description
906
============================  ===========================
907
fix-superusers                Transform superusers created by syncdb into AstakosUser instances
908
cleanup-full                  Cleanup sessions and session catalog
909
commission-list               List pending commissions
910
commission-show               Show details for a pending commission
911
component-add                 Register a component
912
component-list                List components
913
component-modify              Modify component attributes
914
component-show                Show component details
915
project-control               Manage projects and applications
916
project-list                  List projects
917
project-show                  Show project details
918
quota-list                    List user quota
919
quota-verify                  Check the integrity of user quota
920
reconcile-resources-astakos   Reconcile resource usage of Quotaholder with Astakos DB
921
resource-list                 List resources
922
resource-modify               Modify a resource's default base quota and boolean flags
923
service-export-astakos        Export Astakos services and resources in JSON format
924
service-import                Register services
925
service-list                  List services
926
service-show                  Show service details
927
term-add                      Add approval terms
928
user-activation-send          Send user activation
929
user-add                      Add user
930
authpolicy-add                Create a new authentication provider policy profile
931
authpolicy-list               List existing authentication provider policy profiles
932
authpolicy-remove             Remove an authentication provider policy
933
authpolicy-set                Assign an existing authentication provider policy profile to a user or group
934
authpolicy-show               Show authentication provider profile details
935
group-add                     Create a group with the given name
936
group-list                    List available groups
937
user-list                     List users
938
user-modify                   Modify user
939
user-show                     Show user details
940
============================  ===========================
941

    
942
Pithos snf-manage commands
943
--------------------------
944

    
945
============================  ===========================
946
Name                          Description
947
============================  ===========================
948
reconcile-commissions-pithos  Display unresolved commissions and trigger their recovery
949
service-export-pithos         Export Pithos services and resources in JSON format
950
reconcile-resources-pithos    Detect unsynchronized usage between Astakos and Pithos DB resources and synchronize them if specified so.
951
============================  ===========================
952

    
953
Cyclades snf-manage commands
954
----------------------------
955

    
956
============================== ===========================
957
Name                           Description
958
============================== ===========================
959
backend-add                    Add a new Ganeti backend
960
backend-list                   List backends
961
backend-modify                 Modify a backend
962
backend-update-status          Update backend statistics for instance allocation
963
backend-remove                 Remove a Ganeti backend
964
server-create                  Create a new server
965
server-show                    Show server details
966
server-list                    List servers
967
server-modify                  Modify a server
968
server-import                  Import an existing Ganeti VM into synnefo
969
server-inspect                 Inspect a server in DB and Ganeti
970
network-create                 Create a new network
971
network-list                   List networks
972
network-modify                 Modify a network
973
network-inspect                Inspect network state in DB and Ganeti
974
network-remove                 Delete a network
975
flavor-create                  Create a new flavor
976
flavor-list                    List flavors
977
flavor-modify                  Modify a flavor
978
image-list                     List images
979
image-show                     Show image details
980
pool-create                    Create a bridge or mac-prefix pool
981
pool-show                      Show pool details
982
pool-list                      List pools
983
pool-modify                    Modify a pool
984
pool-remove                    Delete a pool
985
port-create                    Create a port connecting a server to a network
986
port-inspect                   Inspect the state of a port in DB and Ganeti
987
port-list                      List ports
988
port-remove                    Delete a port
989
floating-ip-create             Create a new floating IP
990
floating-ip-attach             Attach a floating IP to a server
991
floating-ip-dettach            Dettach a flotaing IP from a server
992
floating-ip-list               List floating IPs
993
floating-ip-remove             Delete a floating IP
994
queue-inspect                  Inspect the messages of a RabbitMQ queue
995
queue-retry                    Resend messages from Dead Letter queues to original exchanges
996
service-export-cyclades        Export Cyclades services and resources in JSON format
997
subnet-create                  Create a subnet
998
subnet-inspect                 Inspect a subnet in DB
999
subnet-list                    List subnets
1000
subnet-modify                  Modify a subnet
1001
reconcile-servers              Reconcile servers of Synnefo DB with state of Ganeti backend
1002
reconcile-networks             Reconcile networks of Synnefo DB with state of Ganeti backend
1003
reconcile-pools                Check consistency of pool resources
1004
reconcile-commissions-cyclades Detect and resolve pending commissions to Quotaholder
1005
reconcile-resources-cyclades   Reconcile resource usage of Astakos with Cyclades DB.
1006
============================== ===========================
1007

    
1008

    
1009
Astakos helper scripts
1010
======================
1011

    
1012
Astakos includes two scripts to facilitate the installation procedure.
1013
Running:
1014

    
1015
.. code-block:: console
1016

    
1017
   snf-component-register [<component_name>]
1018

    
1019
automates the registration of the standard Synnefo components (astakos,
1020
cyclades, and pithos) in astakos database. It internally uses the script:
1021

    
1022
.. code-block:: console
1023

    
1024
   snf-service-export <component_name> <base_url>
1025

    
1026
which simulates the export of service and resource definitions of the
1027
standard Synnefo components.
1028

    
1029

    
1030
Pithos managing accounts
1031
========================
1032

    
1033
Pithos provides a utility tool for managing accounts.
1034
To run you just type:
1035

    
1036
.. code-block:: console
1037

    
1038
   # pithos-manage-accounts <command> [arguments]
1039

    
1040
This is the list of the available commands:
1041

    
1042
============================  ===========================
1043
Name                          Description
1044
============================  ===========================
1045
delete                        Remove an account from the Pithos DB
1046
export-quota                  Export account quota in a file
1047
list                          List existing/dublicate accounts
1048
merge                         Move an account contents in another account
1049
set-container-quota           Set container quota for all or a specific account
1050
============================  ===========================
1051

    
1052

    
1053
The "kamaki" API client
1054
=======================
1055

    
1056
To upload, register or modify an image you will need the **kamaki** tool.
1057
Before proceeding make sure that it is configured properly. Verify that
1058
*image.url*, *file.url*, *user.url* and *token* are set as needed:
1059

    
1060
.. code-block:: console
1061

    
1062
   $ kamaki config list
1063

    
1064
To change a setting use ``kamaki config set``:
1065

    
1066
.. code-block:: console
1067

    
1068
   $ kamaki config set image.url https://cyclades.example.com/image
1069
   $ kamaki config set file.url https://pithos.example.com/v1
1070
   $ kamaki config set user.url https://accounts.example.com
1071
   $ kamaki config set token ...
1072

    
1073
To test that everything works, try authenticating the current account with
1074
kamaki:
1075

    
1076
.. code-block:: console
1077

    
1078
  $ kamaki user authenticate
1079

    
1080
This will output user information.
1081

    
1082
Upload Image
1083
------------
1084

    
1085
By convention, images are stored in a container called ``images``. Check if the
1086
container exists, by listing all containers in your account:
1087

    
1088
.. code-block:: console
1089

    
1090
   $ kamaki file list
1091

    
1092
If the container ``images`` does not exist, create it:
1093

    
1094
.. code-block:: console
1095

    
1096
  $ kamaki file create images
1097

    
1098
You are now ready to upload an image to container ``images``. You can upload it
1099
with a Pithos client, or use kamaki directly:
1100

    
1101
.. code-block:: console
1102

    
1103
   $ kamaki file upload ubuntu.iso images
1104

    
1105
You can use any Pithos client to verify that the image was uploaded correctly,
1106
or you can list the contents of the container with kamaki:
1107

    
1108
.. code-block:: console
1109

    
1110
  $ kamaki file list images
1111

    
1112
The full Pithos URL for the previous example will be
1113
``pithos://u53r-un1qu3-1d/images/ubuntu.iso`` where ``u53r-un1qu3-1d`` is the
1114
unique user id (uuid).
1115

    
1116
Register Image
1117
--------------
1118

    
1119
To register an image you will need to use the full Pithos URL. To register as
1120
a public image the one from the previous example use:
1121

    
1122
.. code-block:: console
1123

    
1124
   $ kamaki image register Ubuntu pithos://u53r-un1qu3-1d/images/ubuntu.iso --public
1125

    
1126
The ``--public`` flag is important, if missing the registered image will not
1127
be listed by ``kamaki image list``.
1128

    
1129
Use ``kamaki image register`` with no arguments to see a list of available
1130
options. A more complete example would be the following:
1131

    
1132
.. code-block:: console
1133

    
1134
   $ kamaki image register Ubuntu pithos://u53r-un1qu3-1d/images/ubuntu.iso \
1135
            --public --disk-format diskdump --property kernel=3.1.2
1136

    
1137
To verify that the image was registered successfully use:
1138

    
1139
.. code-block:: console
1140

    
1141
   $ kamaki image list --name-like=ubuntu
1142

    
1143

    
1144
Miscellaneous
1145
=============
1146

    
1147
.. _branding:
1148

    
1149
Branding
1150
--------
1151

    
1152
Since Synnefo v0.14, you are able to adapt the Astakos, Pithos and Cyclades Web
1153
UI to your company’s visual identity. This is possible using the snf-branding
1154
component, which is automatically installed on the nodes running the API
1155
servers for Astakos, Pithos and Cyclades. 
1156

    
1157
Configuration
1158
~~~~~~~~~~~~~
1159

    
1160
This can be done by modifing the settings provided by the snf-branding component
1161
to match your service identity. The settings for the snf-branding application
1162
can be found inside the configuration file ``/etc/synnefo/15-snf-branding.conf``
1163
on the nodes that have Astakos, Pithos and Cyclades installed.
1164

    
1165
By default, the global service name is "Synnefo" and the company name is
1166
"GRNET". These names and their respective logos and URLs are used throughout
1167
the Astakos, Pithos and Cyclades UI.
1168

    
1169
**Names and URLs:**
1170

    
1171
The first group of branding customization refers to the service's and company's
1172
information.
1173

    
1174
You can overwrite the company and the service name and URL respectively by
1175
uncommenting and setting the following:
1176

    
1177
.. code-block:: python
1178
  
1179
  # setting used in Astakos Dashboard/Projects pages
1180
  BRANDING_SERVICE_NAME = 'My cloud'
1181
  BRANDING_SERVICE_URL = 'http://www.mycloud.synnefo.org/'
1182

    
1183
  # settings used in Astakos, Pithos, Cyclades footer only if 
1184
  # BRANDING_SHOW_COPYRIGHT is set to True
1185
  BRANDING_SHOW_COPYRIGHT = True
1186
  BRANDING_COMPANY_NAME = 'Company LTD'
1187
  BRANDING_COMPANY_URL = 'https://www.company-ltd.synnefo.org/'
1188

    
1189

    
1190
**Copyright and footer options:**
1191

    
1192
By default, no Copyright message is shown in the UI footer. If you want to make
1193
it visible in the footer of Astakos, Pithos and Cyclades UI, you can uncomment
1194
and set to ``True`` the ``BRANDING_SHOW_COPYRIGHT`` setting:
1195

    
1196
.. code-block:: python
1197

    
1198
  #BRANDING_SHOW_COPYRIGHT = False
1199

    
1200
Copyright message defaults to 'Copyright (c) 2011-<current_year>
1201
<BRANDING_COMPANY_NAME>.' but you can overwrite it to a completely custom one by
1202
setting the following option:
1203

    
1204
.. code-block:: python
1205

    
1206
  BRANDING_COPYRIGHT_MESSAGE = 'Copyright (c) 2011-2013 GRNET'
1207

    
1208
If you want to include a custom message in the footer, you can uncomment and 
1209
set the ``BRANDING_FOOTER_EXTRA_MESSAGE`` setting. You can use html markup. 
1210
Your custom message will appear  above Copyright message at the Compute 
1211
templates and the Dashboard UI.
1212

    
1213
.. code-block:: python
1214

    
1215
  #BRANDING_FOOTER_EXTRA_MESSAGE = ''
1216

    
1217

    
1218
**Images:**
1219

    
1220
The Astakos, Pithos and Cyclades Web UI has some logos and images.
1221
 
1222
The branding-related images are presented in  the following table:
1223

    
1224
===============  ============================  =========
1225
Image            Name/extension  convention    Usage
1226
===============  ============================  =========
1227
Favicon          favicon.ico                   Favicon for all services
1228
Dashboard logo   dashboard_logo.png            Visible in all Astakos UI pages
1229
Compute logo     compute_logo.png              Visible in all Cyclades UI pages
1230
Console logo     console_logo.png              Visible in the Cyclades Console Window
1231
Storage logo     storage_logo.png              Visible in all Pithos UI pages
1232
===============  ============================  =========
1233

    
1234
There are two methods  available for replacing all, or individual, 
1235
branding-related images:
1236

    
1237
1. Create a new directory inside ``/usr/share/synnefo/static/`` (e.g.
1238
   ``mybranding``) and place there some or all of your images.
1239

    
1240
   If you want to replace all of your images, keep the name/extension
1241
   conventions as indicated in the above table and change the
1242
   ``BRANDING_IMAGE_MEDIA_URL`` setting accordingly:
1243

    
1244
   .. code-block:: python
1245
        
1246
      # using relative path
1247
      BRANDING_IMAGE_MEDIA_URL= '/static/mybranding/images/' 
1248

    
1249
      # or if you already host them in a separate domain (e.g. cdn)
1250
      BRANDING_IMAGE_MEDIA_URL= 'https://cdn.synnefo.org/branding/images/'
1251

    
1252

    
1253
   If you wish to replace individual images, **do not uncomment**
1254
   ``BRANDING_IMAGE_MEDIA_URL``, but instead provide a relative path, pointing to
1255
   the file inside your directory for each ``BRANDING_<image>_URL`` that you wish
1256
   to replace.
1257

    
1258
2. Upload some or all of your images to a server and replace each 
1259
   ``BRANDING_<image>_URL`` with the absolute url of the image (i.e.
1260
   ``BRANDING_DASHBOARD_URL = 'https://www.synnefo.com/images/my_dashboard.jpg'``).
1261

    
1262
   Note that the alternative text  for each image tag inside html documents is 
1263
   alt=“BRANDING_SERVICE_NAME {Dashboard, Compute. Console, Storage}” respectively.
1264

    
1265
.. note:: Retina optimized images:
1266

    
1267
   Synnefo UI is optimized for Retina displays. As far as images are concerned,  
1268
   `retina.js <http://retinajs.com/>`_ is used.
1269

    
1270
   Retina.js checks each image on a page to see if there is a high-resolution 
1271
   version of that image on your server. If a high-resolution variant exists, 
1272
   the script will swap in that image in-place.
1273

    
1274
   The script assumes you use  `Apple's prescribed high-resolution modifier (@2x)
1275
   <http://developer.apple.com/library/ios/#documentation/2DDrawing/Conceptual/
1276
   DrawingPrintingiOS/SupportingHiResScreensInViews/SupportingHiResScreensInViews
1277
   .html#//apple_ref/doc/uid/TP40010156-CH15-SW1>`_ to denote high-resolution 
1278
   image variants on your server.
1279

    
1280
   For each of the images that you wish the script to  replace, you must have a 
1281
   high-resolution variant in the same folder  named correctly and it will be 
1282
   detected automatically. For example if your image is in <my_directory> and is 
1283
   named "my_image.jpg" the script will look in the same directory for an image 
1284
   named "my_image@2x.jpg".
1285

    
1286
   In case that you don’t want to use a high-resolution image, the 
1287
   normal-resolution image will be visible.
1288

    
1289
More branding
1290
~~~~~~~~~~~~~
1291

    
1292
Although, it is not 100% branding-related, further verbal customization is
1293
feasible. 
1294

    
1295
**EMAILS**
1296

    
1297
The output of all email `*`.txt files will be already customized to contain your
1298
company and service names but you can further alter their content if you feel it
1299
best fits your needs as simple as creasynnefo template.    
1300

    
1301
In order to overwrite one or more email-templates you need to place your 
1302
modified <email-file>.txt files respecting the following structure:
1303
  
1304
  **/etc/synnefo/templates/**
1305
      **im/**
1306
          | activation_email.txt
1307
          | email.txt
1308
          | invitation.txt
1309
          | switch_accounts_email.txt
1310
          | welcome_email.txt
1311
          **projects/**
1312
              | project_approval_notification.txt
1313
              | project_denial_notification.txt    
1314
              | project_membership_change_notification.txt
1315
              | project_membership_enroll_notification.txt
1316
              | project_membership_leave_request_notification.txt
1317
              | project_membership_request_notification.txt
1318
              | project_suspension_notification.txt
1319
              | project_termination_notification.txt
1320
      **registration/**
1321
          | email_change_email.txt
1322
          | password_email.txt
1323

    
1324
Feel free to omit any of the above files you do not wish to overwrite.
1325

    
1326
Below is a list of all emails sent by Synnefo to users along with a short 
1327
description and a link to their content:
1328

    
1329
* ``snf-astakos-app/astakos/im/templates/im/email.txt``
1330
  Base email template. Contains a contact email and a “thank you” message.
1331
  (`Link <https://code.grnet.gr/projects/synnefo/repository/revisions/master/changes/snf-astakos-app/astakos/im/templates/im/email.txt>`_)
1332
* ``snf-astakos-app/astakos/im/templates/im/activation_email.txt`` Email sent to
1333
  user that prompts  him/her to click on a link provided to activate the account.
1334
  Extends “email.txt” (`Link <https://code.grnet.gr/projects/synnefo/repository/revisions/master/changes/snf-astakos-app/astakos/im/templates/im/activation_email.txt>`_)
1335
* ``snf-astakos-app/astakos/im/templates/im/invitation.txt`` Email sent to an
1336
  invited user. He/she has to click on a link provided to activate the account.
1337
  Extends “email.txt” (`Link <https://code.grnet.gr/projects/synnefo/repository/revisions/master/changes/snf-astakos-app/astakos/im/templates/im/invitation.txt>`_)
1338
* ``snf-astakos-app/astakos/im/templates/im/switch_accounts_email.txt`` Email
1339
  sent to user upon his/her request to associate this email address with a
1340
  shibboleth account. He/she has to click on a link provided to activate the
1341
  association. Extends “email.txt” (`Link <https://code.grnet.gr/projects/synnefo/repository/revisions/master/changes/snf-astakos-app/astakos/im/templates/im/switch_accounts_email.txt>`_)
1342
* ``snf-astakos-app/astakos/im/templates/im/welcome_email.txt`` Email sent to
1343
  inform the user that his/ her account has been activated. Extends “email.txt”
1344
  (`Link <https://code.grnet.gr/projects/synnefo/repository/revisions/master/changes/snf-astakos-app/astakos/im/templates/im/welcome_email.txt>`_)
1345
* ``snf-astakos-app/astakos/im/templates/registration/email_change_email.txt``
1346
  Email sent to user when he/she has requested new email address assignment. The
1347
  user has to click on a link provided to validate this action. Extends
1348
  “email.txt” (`Link <https://code.grnet.gr/projects/synnefo/repository/revisions/master/changes/snf-astakos-app/astakos/im/templates/registration/email_change_email.txt>`_)
1349
* ``snf-astakos-app/astakos/im/templates/registration/password_email.txt`` Email
1350
  sent for resetting password purpose. The user has to click on a link provided
1351
  to validate this action. Extends “email.txt” (`Link <https://code.grnet.gr/projects/synnefo/repository/revisions/master/changes/snf-astakos-app/astakos/im/templates/registration/password_email.txt>`_)
1352
* ``snf-astakos-app/astakos/im/templates/im/projects/project_approval_notification.txt``
1353
  Informs  the project owner that his/her project has been approved. Extends
1354
  “email.txt” (`Link <https://code.grnet.gr/projects/synnefo/repository/revisions/master/changes/snf-astakos-app/astakos/im/templates/im/projects/project_approval_notification.txt>`_)
1355
* ``snf-astakos-app/astakos/im/templates/im/projects/project_denial_notification.txt``
1356
  Informs the project owner that his/her  project application has been denied
1357
  explaining the reasons. Extends “email.txt” (`Link <https://code.grnet.gr/projects/synnefo/repository/revisions/master/changes/snf-astakos-app/astakos/im/templates/im/projects/project_denial_notification.txt>`_)
1358
* ``snf-astakos-app/astakos/im/templates/im/projects/project_membership_change_notification.txt``
1359
  An email is sent to a user containing information about his project membership
1360
  (whether he has been accepted, rejected or removed). Extends “email.txt” (`Link
1361
  <https://code.grnet.gr/projects/synnefo/repository/revisions/master/changes/snf-astakos-app/astakos/im/templates/im/projects/project_membership_change_notification.txt>`_)
1362
* ``snf-astakos-app/astakos/im/templates/im/projects/project_membership_enroll_notification.txt``
1363
  Informs a user that he/she  has been enrolled to a project. Extends
1364
  “email.txt” (`Link <https://code.grnet.gr/projects/synnefo/repository/revisions/master/changes/snf-astakos-app/astakos/im/templates/im/projects/project_membership_enroll_notification.txt>`_)
1365
* ``snf-astakos-app/astakos/im/templates/im/projects/project_membership_leave_request_notification.txt``
1366
  An email is sent to the project owner to make him aware of a  user having
1367
  requested to leave his project. Extends “email.txt” (`Link <https://code.grnet.gr/projects/synnefo/repository/revisions/master/changes/snf-astakos-app/astakos/im/templates/im/projects/project_membership_leave_request_notification.txt>`_)
1368
* ``snf-astakos-app/astakos/im/templates/im/projects/project_membership_request_notification.txt``
1369
  An email is sent to the project owner to make him/her aware of a user having
1370
  requested to join  his project. Extends “email.txt” (`Link <https://code.grnet.gr/projects/synnefo/repository/revisions/master/changes/snf-astakos-app/astakos/im/templates/im/projects/project_membership_request_notification.txt>`_)
1371
* ``snf-astakos-app/astakos/im/templates/im/projects/project_suspension_notification.txt``
1372
  An email is sent to the project owner to make him/her aware of his/her project
1373
  having been suspended. Extends “email.txt” (`Link <https://code.grnet.gr/projects/synnefo/repository/revisions/master/changes/snf-astakos-app/astakos/im/templates/im/projects/project_suspension_notification.txt>`_)
1374
* ``snf-astakos-app/astakos/im/templates/im/projects/project_termination_notification.txt``
1375
  An email is sent to the project owner to make him/her aware of his/her project
1376
  having been terminated. Extends “email.txt” (`Link <https://code.grnet.gr/projects/synnefo/repository/revisions/master/changes/snf-astakos-app/astakos/im/templates/im/projects/project_termination_notification.txt>`_)
1377

    
1378
.. warning:: Django templates language:
1379

    
1380
  If you choose to  overwrite these email templates, be mindful of the necessary 
1381
  information contained in django template variables that must not be omitted, 
1382
  such as the activation link for activating one’s account and many more. 
1383
  These variables are contained into {{}} inside the templates.
1384

    
1385

    
1386
.. RabbitMQ
1387

    
1388
RabbitMQ Broker
1389
---------------
1390

    
1391
Queue nodes run the RabbitMQ sofware, which provides AMQP functionality. To
1392
guarantee high-availability, more than one Queue nodes should be deployed, each
1393
of them belonging to the same `RabbitMQ cluster
1394
<http://www.rabbitmq.com/clustering.html>`_. Synnefo uses the RabbitMQ
1395
active/active `High Available Queues <http://www.rabbitmq.com/ha.html>`_ which
1396
are mirrored between two nodes within a RabbitMQ cluster.
1397

    
1398
The RabbitMQ nodes that form the cluster, are declared to Synnefo through the
1399
`AMQP_HOSTS` setting. Each time a Synnefo component needs to connect to
1400
RabbitMQ, one of these nodes is chosen in a random way. The client that Synnefo
1401
uses to connect to RabbitMQ, handles connection failures transparently and
1402
tries to reconnect to a different node. As long as one of these nodes are up
1403
and running, functionality of Synnefo should not be downgraded by the RabbitMQ
1404
node failures.
1405

    
1406
All the queues that are being used are declared as durable, meaning that
1407
messages are persistently stored to RabbitMQ, until they get successfully
1408
processed by a client.
1409

    
1410
Currently, RabbitMQ is used by the following components:
1411

    
1412
* `snf-ganeti-eventd`, `snf-ganeti-hook` and `snf-progress-monitor`:
1413
  These components send messages concerning the status and progress of
1414
  jobs in the Ganeti backend.
1415
* `snf-dispatcher`: This daemon, consumes the messages that are sent from
1416
  the above components, and updates the Cyclades DB accordingly.
1417

    
1418

    
1419
Installation
1420
~~~~~~~~~~~~
1421

    
1422
Please check the RabbitMQ documentation which covers extensively the
1423
`installation of RabbitMQ server <http://www.rabbitmq.com/download.html>`_ and
1424
the setup of a `RabbitMQ cluster <http://www.rabbitmq.com/clustering.html>`_.
1425
Also, check out the `web management plugin
1426
<http://www.rabbitmq.com/management.html>`_ that can be useful for managing and
1427
monitoring RabbitMQ.
1428

    
1429
For a basic installation of RabbitMQ on two nodes (node1 and node2) you can do
1430
the following:
1431

    
1432
On both nodes, install rabbitmq-server and create a Synnefo user:
1433

    
1434
.. code-block:: console
1435

    
1436
  $ apt-get install rabbitmq-server
1437
  $ rabbitmqctl add_user synnefo "example_pass"
1438
  $ rabbitmqctl set_permissions synnefo  ".*" ".*" ".*"
1439

    
1440
Also guarantee that both nodes share the same cookie, by running:
1441

    
1442
.. code-block:: console
1443

    
1444
  $ scp node1:/var/lib/rabbitmq/.erlang.cookie node2:/var/lib/rabbitmq/.erlang.cookie
1445

    
1446
and restart the nodes:
1447

    
1448
.. code-block:: console
1449

    
1450
  $ /etc/init.d/rabbitmq-server restart
1451

    
1452

    
1453
To setup the RabbitMQ cluster run:
1454

    
1455
.. code-block:: console
1456

    
1457
  root@node2: rabbitmqctl stop_app
1458
  root@node2: rabbitmqctl reset
1459
  root@node2: rabbitmqctl cluster rabbit@node1 rabbit@node2
1460
  root@node2: rabbitmqctl start_app
1461

    
1462
You can verify that the cluster is set up correctly by running:
1463

    
1464
.. code-block:: console
1465

    
1466
  root@node2: rabbitmqctl cluster_status
1467

    
1468

    
1469
Logging
1470
-------
1471

    
1472
Logging in Synnefo is using Python's logging module. The module is configured
1473
using dictionary configuration, whose format is described here:
1474

    
1475
http://docs.python.org/release/2.7.1/library/logging.html#logging-config-dictschema
1476

    
1477
Note that this is a feature of Python 2.7 that we have backported for use in
1478
Python 2.6.
1479

    
1480
The logging configuration dictionary is defined in
1481
``/etc/synnefo/10-snf-webproject-logging.conf``
1482

    
1483
The administrator can have finer logging control by modifying the
1484
``LOGGING_SETUP`` dictionary, and defining subloggers with different handlers
1485
and log levels.  e.g. To enable debug messages only for the API set the level
1486
of 'synnefo.api' to ``DEBUG``
1487

    
1488
By default, the Django webapp and snf-manage logs to syslog, while
1489
`snf-dispatcher` logs to `/var/log/synnefo/dispatcher.log`.
1490

    
1491

    
1492
.. _scale-up:
1493

    
1494
Scaling up to multiple nodes
1495
============================
1496

    
1497
Here we will describe how should a large scale Synnefo deployment look like. Make
1498
sure you are familiar with Synnefo and Ganeti before proceeding with this section.
1499
This means you should at least have already set up successfully a working Synnefo
1500
deployment as described in the :ref:`Admin's Installation Guide
1501
<quick-install-admin-guide>` and also read the Administrator's Guide until this
1502
section.
1503

    
1504
Graph of a scale-out Synnefo deployment
1505
---------------------------------------
1506

    
1507
Each box in the following graph corresponds to a distinct physical node:
1508

    
1509
.. image:: images/synnefo-arch2-roles.png
1510
   :width: 100%
1511
   :target: _images/synnefo-arch2-roles.png
1512

    
1513
The above graph is actually the same with the one at the beginning of this
1514
:ref:`guide <admin-guide>`, with the only difference that here we show the
1515
Synnefo roles of each physical node. These roles are described in the
1516
following section.
1517

    
1518
.. _physical-node-roles:
1519

    
1520
Physical Node roles
1521
-------------------
1522

    
1523
As appears in the previous graph, a scale-out Synnefo deployment consists of
1524
multiple physical nodes that have the following roles:
1525

    
1526
* **WEBSERVER**: A web server running in front of gunicorn (e.g.: Apache, nginx)
1527
* **ASTAKOS**: The Astakos application (gunicorn)
1528
* **ASTAKOS_DB**: The Astakos database (postgresql)
1529
* **PITHOS**: The Pithos application (gunicorn)
1530
* **PITHOS_DB**: The Pithos database (postgresql)
1531
* **CYCLADES**: The Cyclades application (gunicorn)
1532
* **CYCLADES_DB**: The Cyclades database (postgresql)
1533
* **MQ**: The message queue (RabbitMQ)
1534
* **GANETI_MASTER**: The Ganeti master of a Ganeti cluster
1535
* **GANETI_NODE** : A VM-capable Ganeti node of a Ganeti cluster
1536

    
1537
You will probably also have:
1538

    
1539
* **CMS**: The CMS used as a frotend portal for the Synnefo services
1540
* **NS**: A nameserver serving all other Synnefo nodes and resolving Synnefo FQDNs
1541
* **CLIENT**: A machine that runs the Synnefo clients (e.g.: kamaki, Web UI),
1542
              most of the times, the end user's local machine
1543

    
1544
From this point we will also refer to the following groups of roles:
1545

    
1546
* **SYNNEFO**: [ **ASTAKOS**, **ASTAKOS_DB**, **PITHOS**, **PITHOS_DB**, **CYCLADES**, **CYCLADES_DB**, **MQ**, **CMS**]
1547
* **G_BACKEND**: [**GANETI_MASTER**, **GANETI_NODE**]
1548

    
1549
Of course, when deploying Synnefo you can combine multiple of the above roles on a
1550
single physical node, but if you are trying to scale out, the above separation
1551
gives you significant advantages.
1552

    
1553
So, in the next section we will take a look on what components you will have to
1554
install on each physical node depending on its Synnefo role. We assume the graph's
1555
architecture.
1556

    
1557
Components for each role
1558
------------------------
1559

    
1560
When deploying Synnefo in large scale, you need to install different Synnefo
1561
or/and third party components on different physical nodes according to their
1562
Synnefo role, as stated in the previous section.
1563

    
1564
Specifically:
1565

    
1566
Role **WEBSERVER**
1567
    * Synnefo components: `None`
1568
    * 3rd party components: Apache
1569
Role **ASTAKOS**
1570
    * Synnefo components: `snf-webproject`, `snf-astakos-app`
1571
    * 3rd party components: Django, Gunicorn
1572
Role **ASTAKOS_DB**
1573
    * Synnefo components: `None`
1574
    * 3rd party components: PostgreSQL
1575
Role **PITHOS**
1576
    * Synnefo components: `snf-webproject`, `snf-pithos-app`, `snf-pithos-webclient`
1577
    * 3rd party components: Django, Gunicorn
1578
Role **PITHOS_DB**
1579
    * Synnefo components: `None`
1580
    * 3rd party components: PostgreSQL
1581
Role **CYCLADES**
1582
    * Synnefo components: `snf-webproject`, `snf-cyclades-app`, `snf-vncauthproxy`
1583
    * 3rd party components: Django Gunicorn
1584
Role **CYCLADES_DB**
1585
    * Synnefo components: `None`
1586
    * 3rd party components: PostgreSQL
1587
Role **MQ**
1588
    * Synnefo components: `None`
1589
    * 3rd party components: RabbitMQ
1590
Role **GANETI_MASTER**
1591
    * Synnefo components: `snf-cyclades-gtools`
1592
    * 3rd party components: Ganeti
1593
Role **GANETI_NODE**
1594
    * Synnefo components: `snf-cyclades-gtools`, `snf-network`, `snf-image`, `nfdhcpd`
1595
    * 3rd party components: Ganeti
1596
Role **CMS**
1597
    * Synnefo components: `snf-webproject`, `snf-cloudcms`
1598
    * 3rd party components: Django, Gunicorn
1599
Role **NS**
1600
    * Synnefo components: `None`
1601
    * 3rd party components: BIND
1602
Role **CLIENT**
1603
    * Synnefo components: `kamaki`, `snf-image-creator`
1604
    * 3rd party components: `None`
1605

    
1606
Example scale out installation
1607
------------------------------
1608

    
1609
In this section we describe an example of a medium scale installation which
1610
combines multiple roles on 10 different physical nodes. We also provide a
1611
:ref:`guide <i-synnefo>` to help with such an install.
1612

    
1613
We assume that we have the following 10 physical nodes with the corresponding
1614
roles:
1615

    
1616
Node1:
1617
    **WEBSERVER**, **ASTAKOS**
1618
      Guide sections:
1619
        * :ref:`apt <i-apt>`
1620
        * :ref:`gunicorn <i-gunicorn>`
1621
        * :ref:`apache <i-apache>`
1622
        * :ref:`snf-webproject <i-webproject>`
1623
        * :ref:`snf-astakos-app <i-astakos>`
1624
Node2:
1625
    **WEBSERVER**, **PITHOS**
1626
      Guide sections:
1627
        * :ref:`apt <i-apt>`
1628
        * :ref:`gunicorn <i-gunicorn>`
1629
        * :ref:`apache <i-apache>`
1630
        * :ref:`snf-webproject <i-webproject>`
1631
        * :ref:`snf-pithos-app <i-pithos>`
1632
        * :ref:`snf-pithos-webclient <i-pithos>`
1633
Node3:
1634
    **WEBSERVER**, **CYCLADES**
1635
      Guide sections:
1636
        * :ref:`apt <i-apt>`
1637
        * :ref:`gunicorn <i-gunicorn>`
1638
        * :ref:`apache <i-apache>`
1639
        * :ref:`snf-webproject <i-webproject>`
1640
        * :ref:`snf-cyclades-app <i-cyclades>`
1641
        * :ref:`snf-vncauthproxy <i-cyclades>`
1642
Node4:
1643
    **WEBSERVER**, **CMS**
1644
      Guide sections:
1645
        * :ref:`apt <i-apt>`
1646
        * :ref:`gunicorn <i-gunicorn>`
1647
        * :ref:`apache <i-apache>`
1648
        * :ref:`snf-webproject <i-webproject>`
1649
        * :ref:`snf-cloudcms <i-cms>`
1650
Node5:
1651
    **ASTAKOS_DB**, **PITHOS_DB**, **CYCLADES_DB**
1652
      Guide sections:
1653
        * :ref:`apt <i-apt>`
1654
        * :ref:`postgresql <i-db>`
1655
Node6:
1656
    **MQ**
1657
      Guide sections:
1658
        * :ref:`apt <i-apt>`
1659
        * :ref:`rabbitmq <i-mq>`
1660
Node7:
1661
    **GANETI_MASTER**, **GANETI_NODE**
1662
      Guide sections:
1663
        * :ref:`apt <i-apt>`
1664
        * :ref:`general <i-backends>`
1665
        * :ref:`ganeti <i-ganeti>`
1666
        * :ref:`snf-cyclades-gtools <i-gtools>`
1667
        * :ref:`snf-network <i-network>`
1668
        * :ref:`snf-image <i-image>`
1669
        * :ref:`nfdhcpd <i-network>`
1670
Node8:
1671
    **GANETI_NODE**
1672
      Guide sections:
1673
        * :ref:`apt <i-apt>`
1674
        * :ref:`general <i-backends>`
1675
        * :ref:`ganeti <i-ganeti>`
1676
        * :ref:`snf-cyclades-gtools <i-gtools>`
1677
        * :ref:`snf-network <i-network>`
1678
        * :ref:`snf-image <i-image>`
1679
        * :ref:`nfdhcpd <i-network>`
1680
Node9:
1681
    **GANETI_NODE**
1682
      Guide sections:
1683
        `Same as Node8`
1684
Node10:
1685
    **GANETI_NODE**
1686
      Guide sections:
1687
        `Same as Node8`
1688

    
1689
All sections: :ref:`Scale out Guide <i-synnefo>`
1690

    
1691

    
1692
Upgrade Notes
1693
=============
1694

    
1695
.. toctree::
1696
   :maxdepth: 1
1697

    
1698
   v0.12 -> v0.13 <upgrade/upgrade-0.13>
1699
   v0.13 -> v0.14 <upgrade/upgrade-0.14>
1700
   v0.14 -> v0.14.2 <upgrade/upgrade-0.14.2>
1701
   v0.14.5 -> v0.14.6 <upgrade/upgrade-0.14.6>
1702
   v0.14.7 -> v0.14.8 <upgrade/upgrade-0.14.8>
1703
   v0.14 -> v0.15 <upgrade/upgrade-0.15>
1704

    
1705

    
1706
Changelog, NEWS
1707
===============
1708

    
1709

    
1710
* v0.14.9 :ref:`Changelog <Changelog-0.14.9>`, :ref:`NEWS <NEWS-0.14.9>`
1711
* v0.14.8 :ref:`Changelog <Changelog-0.14.8>`, :ref:`NEWS <NEWS-0.14.8>`
1712
* v0.14.7 :ref:`Changelog <Changelog-0.14.7>`, :ref:`NEWS <NEWS-0.14.7>`
1713
* v0.14.6 :ref:`Changelog <Changelog-0.14.6>`, :ref:`NEWS <NEWS-0.14.6>`
1714
* v0.14.5 :ref:`Changelog <Changelog-0.14.5>`, :ref:`NEWS <NEWS-0.14.5>`
1715
* v0.14.4 :ref:`Changelog <Changelog-0.14.4>`, :ref:`NEWS <NEWS-0.14.4>`
1716
* v0.14.3 :ref:`Changelog <Changelog-0.14.3>`, :ref:`NEWS <NEWS-0.14.3>`
1717
* v0.14.2 :ref:`Changelog <Changelog-0.14.2>`, :ref:`NEWS <NEWS-0.14.2>`
1718
* v0.14 :ref:`Changelog <Changelog-0.14>`, :ref:`NEWS <NEWS-0.14>`
1719
* v0.13 :ref:`Changelog <Changelog-0.13>`, :ref:`NEWS <NEWS-0.13>`