Statistics
| Branch: | Tag: | Revision:

root / docs / admin-guide.rst @ 44cc2a6a

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

    
304
In 20-snf-astakos-app-settings.conf, 
305
uncomment the default setting ``ASTAKOS_SERVICES``
306
and customize the ``'uplimit'`` values.
307
These are the default base quota for all users.
308

    
309
To apply your configuration run::
310

    
311
    # snf-manage astakos-init --load-service-resources
312
    # snf-manage quota --sync
313

    
314
Set base quota for individual users
315
```````````````````````````````````
316

    
317
For individual users that need different quota than the default
318
you can set it for each resource like this::
319

    
320
    # use this to display quota / uuid
321
    # snf-manage user-show 'uuid or email' --quota
322

    
323
    # snf-manage user-modify 'user-uuid' --set-base-quota 'cyclades.vm' 10
324

    
325

    
326
Enable the Projects feature
327
~~~~~~~~~~~~~~~~~~~~~~~~~~~
328

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

    
333
    # this will make the 'projects' page visible in the dashboard
334
    ASTAKOS_PROJECTS_VISIBLE = True
335

    
336
You can change the maximum allowed number of pending project applications
337
per user with::
338

    
339
    # snf-manage resource-modify astakos.pending_app --limit <number>
340

    
341
You can also set a user-specific limit with::
342

    
343
    # snf-manage user-modify 'user-uuid' --set-base-quota 'astakos.pending_app' 5
344

    
345
When users apply for projects they are not automatically granted
346
the resources. They must first be approved by the administrator.
347

    
348
To list pending project applications in astakos::
349

    
350
    # snf-manage project-list --pending
351

    
352
Note the last column, the application id. To approve it::
353

    
354
    # <app id> from the last column of project-list
355
    # snf-manage project-control --approve <app id>
356

    
357
To deny an application::
358

    
359
    # snf-manage project-control --deny <app id>
360

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

    
365
    # UUIDs of users that can approve or deny project applications from the web.
366
    ASTAKOS_PROJECT_ADMINS = [<uuid>, ...]
367

    
368

    
369
Astakos advanced operations
370
---------------------------
371

    
372
Adding "Terms of Use"
373
~~~~~~~~~~~~~~~~~~~~~
374

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

    
379
.. code-block:: console
380

    
381
   <h1>My cloud service terms</h1>
382

    
383
   These are the example terms for my cloud service
384

    
385
Then, add those terms-of-use with the snf-manage command:
386

    
387
.. code-block:: console
388

    
389
   $ snf-manage term-add /usr/share/synnefo/sample-terms.html
390

    
391
Your terms have been successfully added and you will see the corresponding link
392
appearing in the Astakos web pages' footer.
393

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

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

    
403
Enabling reCAPTCHA
404
~~~~~~~~~~~~~~~~~~
405

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

    
413
.. code-block:: console
414

    
415
   ASTAKOS_RECAPTCHA_PUBLIC_KEY = 'example_recaptcha_public_key!@#$%^&*('
416
   ASTAKOS_RECAPTCHA_PRIVATE_KEY = 'example_recaptcha_private_key!@#$%^&*('
417

    
418
   ASTAKOS_RECAPTCHA_ENABLED = True
419

    
420
Restart the service on the Astakos node(s) and you are ready:
421

    
422
.. code-block:: console
423

    
424
   # /etc/init.d/gunicorn restart
425

    
426
Checkout your new Sign up page. If you see the reCAPTCHA box, you have setup
427
everything correctly.
428

    
429

    
430
Astakos internals
431
-----------------
432

    
433
X-Auth-Token
434
~~~~~~~~~~~~
435

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

    
446
.. _authentication-label:
447

    
448
Django Auth methods and Backends
449
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
450

    
451
Astakos incorporates Django user authentication system and extends its User model.
452

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

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

    
464
Logged on users can perform a number of actions:
465

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

    
471
Internal Astakos requests are handled using cookie-based Django user sessions.
472

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

    
479
The login URI accepts the following parameters:
480

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

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

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

    
496

    
497
Compute/Network/Image Service (Cyclades)
498
========================================
499

    
500
Working with Cyclades
501
---------------------
502

    
503
Managing Ganeti Backends
504
~~~~~~~~~~~~~~~~~~~~~~~~
505

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

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

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

    
522
Listing existing backends
523
`````````````````````````
524
To list all the Ganeti backends known to Synnefo, we run:
525

    
526
.. code-block:: console
527

    
528
   $ snf-manage backend-list
529

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

    
537
To add this Ganeti cluster, we run:
538

    
539
.. code-block:: console
540

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

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

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

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

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

    
561
.. code-block:: console
562

    
563
   $ snf-manage backend-modify --drained=False <backend_id>
564

    
565
Removing an existing Ganeti backend
566
```````````````````````````````````
567
In order to remove an existing backend from Synnefo, we run:
568

    
569
.. code-block:: console
570

    
571
   # snf-manage backend-remove <backend_id>
572

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

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

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

    
589
.. code-block:: console
590

    
591
   $ snf-manage backend-modify --drained=True <backend_id>
592

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

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

    
605
Allocation based on disk-templates
606
**********************************
607

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

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

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

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

    
631

    
632
Managing Virtual Machines
633
~~~~~~~~~~~~~~~~~~~~~~~~~
634

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

    
642
Apart from handling instances directly in the Ganeti level, a number of `snf-manage`
643
commands are available:
644

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

    
652

    
653
Managing Virtual Networks
654
~~~~~~~~~~~~~~~~~~~~~~~~~
655

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

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

    
666
There are also the following `snf-manage` commands for managing networks:
667

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

    
675
Managing Network Resources
676
``````````````````````````
677

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

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

    
692
IPv4 addresses
693
**************
694

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

    
704
.. code-block:: console
705

    
706
 snf-manage network-modify --add-reserved-ips=10.0.0.21,10.0.0.22 42
707

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

    
712
Bridges
713
*******
714

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

    
721
.. code-block:: console
722

    
723
   # snf-manage pool-create --type=bridge --base=prv --size=20
724

    
725
You can verify the creation of the pool, and check its contents by running:
726

    
727
.. code-block:: console
728

    
729
   # snf-manage pool-list
730
   # snf-manage pool-show --type=bridge 1
731

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

    
735
MAC Prefixes
736
************
737

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

    
742
.. code-block:: console
743

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

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

    
751
Pool reconciliation
752
*******************
753

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

    
758

    
759
Cyclades advanced operations
760
----------------------------
761

    
762
Reconciliation mechanism
763
~~~~~~~~~~~~~~~~~~~~~~~~
764

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

    
771
Reconciling Virtual Machines
772
````````````````````````````
773

    
774
Reconciliation of VMs detects the following conditions:
775

    
776
 * Stale DB servers without corresponding Ganeti instances
777
 * Orphan Ganeti instances, without corresponding DB entries
778
 * Out-of-sync state for DB entries wrt to Ganeti instances
779

    
780
To detect all inconsistencies you can just run:
781

    
782
.. code-block:: console
783

    
784
  $ snf-manage reconcile-servers
785

    
786
Adding the `--fix-all` option, will do the actual synchronization:
787

    
788
.. code-block:: console
789

    
790
  $ snf-manage reconcile-servers --fix-all
791

    
792
Please see ``snf-manage reconcile-servers --help`` for all the details.
793

    
794
Reconciling Networks
795
````````````````````
796

    
797
Reconciliation of Networks detects the following conditions:
798

    
799
  * Stale DB networks without corresponding Ganeti networks
800
  * Orphan Ganeti networks, without corresponding DB entries
801
  * Private networks that are not created to all Ganeti backends
802
  * Unsynchronized IP pools
803

    
804
To detect all inconsistencies you can just run:
805

    
806
.. code-block:: console
807

    
808
  $ snf-manage reconcile-networks
809

    
810
Adding the `--fix-all` option, will do the actual synchronization:
811

    
812
.. code-block:: console
813

    
814
  $ snf-manage reconcile-networks --fix-all
815

    
816
Please see ``snf-manage reconcile-networks --help`` for all the details.
817

    
818

    
819
Cyclades internals
820
------------------
821

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

    
832
.. image:: images/cyclades-ganeti-communication.png
833
   :width: 50%
834
   :target: _images/cyclades-ganeti-communication.png
835

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

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

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

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

    
859

    
860
Synnefo management commands ("snf-manage")
861
==========================================
862

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

    
871
To run "snf-manage" you just type:
872

    
873
.. code-block:: console
874

    
875
   # snf-manage <command> [arguments]
876

    
877
on the corresponding host that runs the service. For example, if you have all
878
services running on different physical hosts you would do:
879

    
880
.. code-block:: console
881

    
882
   root@astakos-host # snf-manage <astakos-command> [argument]
883
   root@pithos-host # snf-manage <pithos-command> [argument]
884
   root@cyclades-host # snf-manage <cyclades-command> [argument]
885

    
886
If you have all services running on the same host you would do:
887

    
888
.. code-block:: console
889

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

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

    
896
.. code-block:: console
897

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

    
902
This is the complete list of "snf-manage" commands for each service.
903

    
904
Astakos snf-manage commands
905
---------------------------
906

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

    
945
Pithos snf-manage commands
946
--------------------------
947

    
948
============================  ===========================
949
Name                          Description
950
============================  ===========================
951
reconcile-commissions-pithos  Display unresolved commissions and trigger their recovery
952
resource-export-pithos        Export pithos resources in json format
953
reconcile-resources-pithos    Detect unsynchronized usage between Astakos and Pithos DB resources and synchronize them if specified so.
954
============================  ===========================
955

    
956
Cyclades snf-manage commands
957
----------------------------
958

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

    
1012

    
1013
Astakos helper scripts
1014
======================
1015

    
1016
Astakos includes two scripts to facilitate the installation procedure.
1017
Running:
1018

    
1019
.. code-block:: console
1020

    
1021
   snf-component-register [<component_name>]
1022

    
1023
automates the registration of the standard Synnefo components (astakos,
1024
cyclades, and pithos) in astakos database. It internally uses the script:
1025

    
1026
.. code-block:: console
1027

    
1028
   snf-service-export <component_name> <base_url>
1029

    
1030
which simulates the export of service and resource definitions of the
1031
standard Synnefo components.
1032

    
1033

    
1034
Pithos managing accounts
1035
========================
1036

    
1037
Pithos provides a utility tool for managing accounts.
1038
To run you just type:
1039

    
1040
.. code-block:: console
1041

    
1042
   # pithos-manage-accounts <command> [arguments]
1043

    
1044
This is the list of the available commands:
1045

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

    
1056

    
1057
The "kamaki" API client
1058
=======================
1059

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

    
1064
.. code-block:: console
1065

    
1066
   $ kamaki config list
1067

    
1068
To change a setting use ``kamaki config set``:
1069

    
1070
.. code-block:: console
1071

    
1072
   $ kamaki config set image.url https://cyclades.example.com/image
1073
   $ kamaki config set file.url https://pithos.example.com/v1
1074
   $ kamaki config set user.url https://accounts.example.com
1075
   $ kamaki config set token ...
1076

    
1077
To test that everything works, try authenticating the current account with
1078
kamaki:
1079

    
1080
.. code-block:: console
1081

    
1082
  $ kamaki user authenticate
1083

    
1084
This will output user information.
1085

    
1086
Upload Image
1087
------------
1088

    
1089
By convention, images are stored in a container called ``images``. Check if the
1090
container exists, by listing all containers in your account:
1091

    
1092
.. code-block:: console
1093

    
1094
   $ kamaki file list
1095

    
1096
If the container ``images`` does not exist, create it:
1097

    
1098
.. code-block:: console
1099

    
1100
  $ kamaki file create images
1101

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

    
1105
.. code-block:: console
1106

    
1107
   $ kamaki file upload ubuntu.iso images
1108

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

    
1112
.. code-block:: console
1113

    
1114
  $ kamaki file list images
1115

    
1116
The full Pithos URL for the previous example will be
1117
``pithos://u53r-un1qu3-1d/images/ubuntu.iso`` where ``u53r-un1qu3-1d`` is the
1118
unique user id (uuid).
1119

    
1120
Register Image
1121
--------------
1122

    
1123
To register an image you will need to use the full Pithos URL. To register as
1124
a public image the one from the previous example use:
1125

    
1126
.. code-block:: console
1127

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

    
1130
The ``--public`` flag is important, if missing the registered image will not
1131
be listed by ``kamaki image list``.
1132

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

    
1136
.. code-block:: console
1137

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

    
1141
To verify that the image was registered successfully use:
1142

    
1143
.. code-block:: console
1144

    
1145
   $ kamaki image list --name-like=ubuntu
1146

    
1147

    
1148
Miscellaneous
1149
=============
1150

    
1151
.. _branding:
1152

    
1153
Branding
1154
--------
1155

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

    
1161
Configuration
1162
~~~~~~~~~~~~~
1163

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

    
1169
By default, the global service name is "Synnefo" and the company name is
1170
"GRNET". These names and their respective logos and URLs are used throughout
1171
the Astakos, Pithos and Cyclades UI.
1172

    
1173
**Names and URLs:**
1174

    
1175
The first group of branding customization refers to the service's and company's
1176
information.
1177

    
1178
You can overwrite the company and the service name and URL respectively by
1179
uncommenting and setting the following:
1180

    
1181
.. code-block:: python
1182
  
1183
  # setting used in Astakos Dashboard/Projects pages
1184
  BRANDING_SERVICE_NAME = 'My cloud'
1185
  BRANDING_SERVICE_URL = 'http://www.mycloud.synnefo.org/'
1186

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

    
1193

    
1194
**Copyright and footer options:**
1195

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

    
1200
.. code-block:: python
1201

    
1202
  #BRANDING_SHOW_COPYRIGHT = False
1203

    
1204
Copyright message defaults to 'Copyright (c) 2011-<current_year>
1205
<BRANDING_COMPANY_NAME>.' but you can overwrite it to a completely custom one by
1206
setting the following option:
1207

    
1208
.. code-block:: python
1209

    
1210
  BRANDING_COPYRIGHT_MESSAGE = 'Copyright (c) 2011-2013 GRNET'
1211

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

    
1217
.. code-block:: python
1218

    
1219
  #BRANDING_FOOTER_EXTRA_MESSAGE = ''
1220

    
1221

    
1222
**Images:**
1223

    
1224
The Astakos, Pithos and Cyclades Web UI has some logos and images.
1225
 
1226
The branding-related images are presented in  the following table:
1227

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

    
1238
There are two methods  available for replacing all, or individual, 
1239
branding-related images:
1240

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

    
1244
   If you want to replace all of your images, keep the name/extension
1245
   conventions as indicated in the above table and change the
1246
   ``BRANDING_IMAGE_MEDIA_URL`` setting accordingly:
1247

    
1248
   .. code-block:: python
1249
        
1250
      # using relative path
1251
      BRANDING_IMAGE_MEDIA_URL= '/static/mybranding/images/' 
1252

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

    
1256

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

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

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

    
1269
.. note:: Retina optimized images:
1270

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

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

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

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

    
1290
   In case that you don’t want to use a high-resolution image, the 
1291
   normal-resolution image will be visible.
1292

    
1293
More branding
1294
~~~~~~~~~~~~~
1295

    
1296
Although, it is not 100% branding-related, further verbal customization is
1297
feasible. 
1298

    
1299
**EMAILS**
1300

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

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

    
1328
Feel free to omit any of the above files you do not wish to overwrite.
1329

    
1330
Below is a list of all emails sent by Synnefo to users along with a short 
1331
description and a link to their content:
1332

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

    
1382
.. warning:: Django templates language:
1383

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

    
1389

    
1390
.. RabbitMQ
1391

    
1392
RabbitMQ Broker
1393
---------------
1394

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

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

    
1410
All the queues that are being used are declared as durable, meaning that
1411
messages are persistently stored to RabbitMQ, until they get successfully
1412
processed by a client.
1413

    
1414
Currently, RabbitMQ is used by the following components:
1415

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

    
1422

    
1423
Installation
1424
~~~~~~~~~~~~
1425

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

    
1433
For a basic installation of RabbitMQ on two nodes (node1 and node2) you can do
1434
the following:
1435

    
1436
On both nodes, install rabbitmq-server and create a Synnefo user:
1437

    
1438
.. code-block:: console
1439

    
1440
  $ apt-get install rabbitmq-server
1441
  $ rabbitmqctl add_user synnefo "example_pass"
1442
  $ rabbitmqctl set_permissions synnefo  ".*" ".*" ".*"
1443

    
1444
Also guarantee that both nodes share the same cookie, by running:
1445

    
1446
.. code-block:: console
1447

    
1448
  $ scp node1:/var/lib/rabbitmq/.erlang.cookie node2:/var/lib/rabbitmq/.erlang.cookie
1449

    
1450
and restart the nodes:
1451

    
1452
.. code-block:: console
1453

    
1454
  $ /etc/init.d/rabbitmq-server restart
1455

    
1456

    
1457
To setup the RabbitMQ cluster run:
1458

    
1459
.. code-block:: console
1460

    
1461
  root@node2: rabbitmqctl stop_app
1462
  root@node2: rabbitmqctl reset
1463
  root@node2: rabbitmqctl cluster rabbit@node1 rabbit@node2
1464
  root@node2: rabbitmqctl start_app
1465

    
1466
You can verify that the cluster is set up correctly by running:
1467

    
1468
.. code-block:: console
1469

    
1470
  root@node2: rabbitmqctl cluster_status
1471

    
1472

    
1473
Logging
1474
-------
1475

    
1476
Logging in Synnefo is using Python's logging module. The module is configured
1477
using dictionary configuration, whose format is described here:
1478

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

    
1481
Note that this is a feature of Python 2.7 that we have backported for use in
1482
Python 2.6.
1483

    
1484
The logging configuration dictionary is defined in
1485
``/etc/synnefo/10-snf-webproject-logging.conf``
1486

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

    
1492
By default, the Django webapp and snf-manage logs to syslog, while
1493
`snf-dispatcher` logs to `/var/log/synnefo/dispatcher.log`.
1494

    
1495

    
1496
.. _scale-up:
1497

    
1498
Scaling up to multiple nodes
1499
============================
1500

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

    
1508
Graph of a scale-out Synnefo deployment
1509
---------------------------------------
1510

    
1511
Each box in the following graph corresponds to a distinct physical node:
1512

    
1513
.. image:: images/synnefo-arch2-roles.png
1514
   :width: 100%
1515
   :target: _images/synnefo-arch2-roles.png
1516

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

    
1522
.. _physical-node-roles:
1523

    
1524
Physical Node roles
1525
-------------------
1526

    
1527
As appears in the previous graph, a scale-out Synnefo deployment consists of
1528
multiple physical nodes that have the following roles:
1529

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

    
1541
You will probably also have:
1542

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

    
1548
From this point we will also refer to the following groups of roles:
1549

    
1550
* **SYNNEFO**: [ **ASTAKOS**, **ASTAKOS_DB**, **PITHOS**, **PITHOS_DB**, **CYCLADES**, **CYCLADES_DB**, **MQ**, **CMS**]
1551
* **G_BACKEND**: [**GANETI_MASTER**, **GANETI_NODE**]
1552

    
1553
Of course, when deploying Synnefo you can combine multiple of the above roles on a
1554
single physical node, but if you are trying to scale out, the above separation
1555
gives you significant advantages.
1556

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

    
1561
Components for each role
1562
------------------------
1563

    
1564
When deploying Synnefo in large scale, you need to install different Synnefo
1565
or/and third party components on different physical nodes according to their
1566
Synnefo role, as stated in the previous section.
1567

    
1568
Specifically:
1569

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

    
1610
Example scale out installation
1611
------------------------------
1612

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

    
1617
We assume that we have the following 10 physical nodes with the corresponding
1618
roles:
1619

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

    
1693
All sections: :ref:`Scale out Guide <i-synnefo>`
1694

    
1695

    
1696
Upgrade Notes
1697
=============
1698

    
1699
.. toctree::
1700
   :maxdepth: 1
1701

    
1702
   v0.12 -> v0.13 <upgrade/upgrade-0.13>
1703
   v0.13 -> v0.14 <upgrade/upgrade-0.14>
1704
   v0.14 -> v0.14.2 <upgrade/upgrade-0.14.2>
1705
   v0.14.5 -> v0.14.6 <upgrade/upgrade-0.14.6>
1706
   v0.14.7 -> v0.14.8 <upgrade/upgrade-0.14.8>
1707
   v0.14 -> v0.15 <upgrade/upgrade-0.15>
1708

    
1709

    
1710
Changelog, NEWS
1711
===============
1712

    
1713

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