Statistics
| Branch: | Tag: | Revision:

root / snf-deploy / fabfile.py @ e66eb6d6

History | View | Annotate | Download (39.7 kB)

1
from __future__ import with_statement
2
from fabric.api import *
3
from fabric.contrib.console import confirm
4
from random import choice
5
from fabric.operations import run, put
6
import re
7
import shutil, os
8
from functools import wraps
9
import imp
10
import ConfigParser
11
import sys
12
import tempfile
13
import ast
14
from snfdeploy.lib import *
15
from snfdeploy import massedit
16

    
17

    
18
def setup_env(confdir="conf", packages="packages",
19
              templates="files", cluster_name="ganeti1", autoconf=False, disable_colors=False, key_inject=False):
20
    print("Loading configuration for synnefo...")
21
    print(" * Using config files under %s..." % confdir)
22
    print(" * Using %s and %s for packages and templates accordingly..." % (packages, templates))
23

    
24
    autoconf = ast.literal_eval(autoconf)
25
    disable_colors = ast.literal_eval(disable_colors)
26
    env.key_inject = ast.literal_eval(key_inject)
27
    conf = Conf.configure(confdir=confdir, cluster_name=cluster_name, autoconf=autoconf)
28
    env.env = Env(conf)
29

    
30
    env.local = autoconf
31
    env.password = env.env.password
32
    env.user = env.env.user
33
    env.shell = "/bin/bash -c"
34

    
35
    if disable_colors:
36
        disable_color()
37

    
38
    if env.env.cms.hostname in [env.env.accounts.hostname, env.env.cyclades.hostname, env.env.pithos.hostname]:
39
      env.cms_pass = True
40
    else:
41
      env.cms_pass = False
42

    
43
    if env.env.accounts.hostname in [env.env.cyclades.hostname, env.env.pithos.hostname]:
44
      env.csrf_disable = True
45
    else:
46
      env.csrf_disable = False
47

    
48

    
49
    env.roledefs = {
50
        "nodes": env.env.ips,
51
        "ips": env.env.ips,
52
        "accounts": [env.env.accounts.ip],
53
        "cyclades": [env.env.cyclades.ip],
54
        "pithos": [env.env.pithos.ip],
55
        "cms": [env.env.cms.ip],
56
        "mq": [env.env.mq.ip],
57
        "db": [env.env.db.ip],
58
        "ns": [env.env.ns.ip],
59
        "client": [env.env.client.ip],
60
        "router": [env.env.router.ip],
61
    }
62

    
63
    env.enable_lvm = False
64
    env.enable_drbd = False
65
    if ast.literal_eval(env.env.create_extra_disk) and env.env.extra_disk:
66
        env.enable_lvm = True
67
        env.enable_drbd = True
68

    
69
    env.roledefs.update({
70
        "ganeti": env.env.cluster_ips,
71
        "master": [env.env.master.ip],
72
    })
73

    
74

    
75
def install_package(package):
76
    debug(env.host, " * Installing package %s..." % package)
77
    APT_GET = "export DEBIAN_FRONTEND=noninteractive ;apt-get install -y --force-yes "
78

    
79
    if ast.literal_eval(env.env.use_local_packages):
80
        with settings(warn_only=True):
81
            deb = local("ls %s/%s*deb" % (env.env.packages, package))
82
            if deb:
83
                debug(env.host, " * Package %s found in %s..." % (package, env.env.packages))
84
                put(deb, "/tmp/")
85
                try_run("dpkg -i /tmp/%s*deb || " % package + APT_GET + "-f")
86
                try_run("rm /tmp/%s*deb" % package)
87
                return
88

    
89
    info = getattr(env.env, package)
90
    if info in ["stable", "squeeze-backports", "testing", "unstable"]:
91
        APT_GET += " -t %s %s " % (info, package)
92
    elif info:
93
        APT_GET += " %s=%s " % (package, info)
94
    else:
95
        APT_GET += package
96

    
97
    try_run(APT_GET)
98

    
99
    return
100

    
101

    
102
@roles("ns")
103
def update_ns_for_ganeti():
104
    debug(env.host, "Updating name server entries for backend %s..." % env.env.cluster.fqdn)
105
    update_arecord(env.env.cluster)
106
    update_ptrrecord(env.env.cluster)
107
    try_run("/etc/init.d/bind9 restart")
108

    
109

    
110
@roles("ns")
111
def update_ns_for_node(node):
112
    info = env.env.nodes_info.get(node)
113
    update_arecord(info)
114
    update_ptrrecord(info)
115
    try_run("/etc/init.d/bind9 restart")
116

    
117

    
118
@roles("ns")
119
def update_arecord(host):
120
    filename = "/etc/bind/zones/" + env.env.domain
121
    cmd = """
122
    echo '{0}' >> {1}
123
    """.format(host.arecord, filename)
124
    try_run(cmd)
125

    
126

    
127
@roles("ns")
128
def update_cnamerecord(host):
129
    filename = "/etc/bind/zones/" + env.env.domain
130
    cmd = """
131
    echo '{0}' >> {1}
132
    """.format(host.cnamerecord, filename)
133
    try_run(cmd)
134

    
135

    
136
@roles("ns")
137
def update_ptrrecord(host):
138
    filename = "/etc/bind/rev/synnefo.in-addr.arpa.zone"
139
    cmd = """
140
    echo '{0}' >> {1}
141
    """.format(host.ptrrecord, filename)
142
    try_run(cmd)
143

    
144
@roles("nodes")
145
def apt_get_update():
146
    debug(env.host, "apt-get update....")
147
    try_run("apt-get update")
148

    
149
@roles("ns")
150
def setup_ns():
151
    debug(env.host, "Setting up name server..")
152
    #WARNING: this should be remove after we are done
153
    # because gevent does pick randomly nameservers and google does
154
    # not know our setup!!!!!
155
    apt_get_update()
156
    install_package("bind9")
157
    tmpl = "/etc/bind/named.conf.local"
158
    replace = {
159
      "domain": env.env.domain,
160
      }
161
    custom = customize_settings_from_tmpl(tmpl, replace)
162
    put(custom, tmpl)
163

    
164
    try_run("mkdir -p /etc/bind/zones")
165
    tmpl = "/etc/bind/zones/example.com"
166
    replace = {
167
      "domain": env.env.domain,
168
      "ns_node_ip": env.env.ns.ip,
169
      }
170
    custom = customize_settings_from_tmpl(tmpl, replace)
171
    remote = "/etc/bind/zones/" + env.env.domain
172
    put(custom, remote)
173

    
174
    try_run("mkdir -p /etc/bind/rev")
175
    tmpl = "/etc/bind/rev/synnefo.in-addr.arpa.zone"
176
    replace = {
177
      "domain": env.env.domain,
178
      }
179
    custom = customize_settings_from_tmpl(tmpl, replace)
180
    put(custom, tmpl)
181

    
182
    tmpl = "/etc/bind/named.conf.options"
183
    replace = {
184
      "NODE_IPS": ";".join(env.env.ips),
185
      }
186
    custom = customize_settings_from_tmpl(tmpl, replace)
187
    put(custom, tmpl, mode=0644)
188

    
189
    for role, info in env.env.roles.iteritems():
190
        if role == "ns":
191
            continue
192
        update_cnamerecord(info)
193
    for node, info in env.env.nodes_info.iteritems():
194
        update_arecord(info)
195
        update_ptrrecord(info)
196

    
197
    try_run("/etc/init.d/bind9 restart")
198

    
199

    
200
@roles("nodes")
201
def check_dhcp():
202
    debug(env.host, "Checking IPs for synnefo..")
203
    for n, info in env.env.nodes_info.iteritems():
204
        try_run("ping -c 1 " + info.ip, True)
205

    
206
@roles("nodes")
207
def check_dns():
208
    debug(env.host, "Checking fqdns for synnefo..")
209
    for n, info in env.env.nodes_info.iteritems():
210
        try_run("ping -c 1 " + info.fqdn, True)
211

    
212
    for n, info in env.env.roles.iteritems():
213
        try_run("ping -c 1 " + info.fqdn, True)
214

    
215
@roles("nodes")
216
def check_connectivity():
217
    debug(env.host, "Checking internet connectivity..")
218
    try_run("ping -c 1 www.google.com", True)
219

    
220

    
221
@roles("nodes")
222
def check_ssh():
223
    debug(env.host, "Checking password-less ssh..")
224
    for n, info in env.env.nodes_info.iteritems():
225
        try_run("ssh " + info.fqdn + "  date", True)
226

    
227

    
228
@roles("ips")
229
def add_keys():
230
    if not env.key_inject:
231
      debug(env.host, "Skipping ssh keys injection..")
232
      return
233
    else:
234
      debug(env.host, "Adding rsa/dsa keys..")
235
    try_run("mkdir -p /root/.ssh")
236
    cmd = """
237
for f in $(ls /root/.ssh/*); do
238
  cp $f $f.bak
239
done
240
    """
241
    try_run(cmd)
242
    files = ["authorized_keys", "id_dsa", "id_dsa.pub",
243
             "id_rsa", "id_rsa.pub"]
244
    for f in files:
245
      tmpl = "/root/.ssh/" + f
246
      replace = {}
247
      custom = customize_settings_from_tmpl(tmpl, replace)
248
      put(custom, tmpl, mode=0600)
249

    
250
    cmd = """
251
if [ -e /root/.ssh/authorized_keys.bak ]; then
252
  cat /root/.ssh/authorized_keys.bak >> /root/.ssh/authorized_keys
253
fi
254
    """
255
    debug(env.host, "Updating exising authorized keys..")
256
    try_run(cmd)
257

    
258
@roles("ips")
259
def setup_resolv_conf():
260
    debug(env.host, "Tweak /etc/resolv.conf...")
261
    try_run("/etc/init.d/network-manager stop")
262
    tmpl = "/etc/dhcp/dhclient-enter-hooks.d/nodnsupdate"
263
    replace = {}
264
    custom = customize_settings_from_tmpl(tmpl, replace)
265
    put(custom, tmpl, mode=0644)
266
    try_run("cp /etc/resolv.conf /etc/resolv.conf.bak")
267
    tmpl = "/etc/resolv.conf"
268
    replace = {
269
      "domain": env.env.domain,
270
      "ns_node_ip": env.env.ns.ip,
271
      }
272
    custom = customize_settings_from_tmpl(tmpl, replace)
273
    try:
274
      put(custom, tmpl)
275
    except:
276
      pass
277
    try_run("chattr +i /etc/resolv.conf")
278

    
279

    
280
@roles("ips")
281
def setup_hosts():
282
    debug(env.host, "Tweaking /etc/hosts and ssh_config files...")
283
    try_run("echo StrictHostKeyChecking no >> /etc/ssh/ssh_config")
284
    cmd = " sed -i 's/^127.*/127.0.0.1 localhost/' /etc/hosts "
285
    try_run(cmd)
286
    host_info = env.env.ips_info[env.host]
287
    cmd = "hostname %s" % host_info.hostname
288
    try_run(cmd)
289
    cmd = "echo %s > /etc/hostname" % host_info.hostname
290
    try_run(cmd)
291

    
292

    
293
def try_run(cmd, abort=False):
294
    try:
295
      if env.local:
296
        return local(cmd, capture=True)
297
      else:
298
        return run(cmd)
299
    except:
300
      debug(env.host, "WARNING: command failed. Continuing anyway...")
301
      if abort:
302
        raise
303

    
304
def create_bridges():
305
    debug(env.host, " * Creating bridges...")
306
    install_package("bridge-utils")
307
    cmd = """
308
    brctl addbr {0} ; ip link set {0} up
309
    """.format(env.env.common_bridge)
310
    try_run(cmd)
311

    
312

    
313
def connect_bridges():
314
    debug(env.host, " * Connecting bridges...")
315
    cmd = """
316
    brctl addif {0} {1}
317
    """.format(env.env.common_bridge, env.env.public_iface)
318
    #try_run(cmd)
319

    
320

    
321
@roles("ganeti")
322
def setup_net_infra():
323
    debug(env.host, "Setup networking infrastracture..")
324
    create_bridges()
325
    connect_bridges()
326

    
327

    
328
@roles("ganeti")
329
def setup_lvm():
330
    debug(env.host, "create volume group %s for ganeti.." % env.env.vg)
331
    if env.enable_lvm:
332
        install_package("lvm2")
333
        cmd = """
334
        pvcreate {0}
335
        vgcreate {1} {0}
336
        """.format(env.env.extra_disk, env.env.vg)
337
        try_run(cmd)
338

    
339

    
340
def customize_settings_from_tmpl(tmpl, replace):
341
    debug(env.host, " * Customizing template %s..." % tmpl)
342
    local = env.env.templates + tmpl
343
    _, custom = tempfile.mkstemp()
344
    shutil.copyfile(local, custom)
345
    for k, v in replace.iteritems():
346
        regex = "re.sub('%{0}%', '{1}', line)".format(k.upper(), v)
347
        massedit.edit_files([custom], [regex], dry_run=False)
348

    
349
    return custom
350

    
351

    
352
@roles("nodes")
353
def setup_apt():
354
    debug(env.host, "Setting up apt sources...")
355
    install_package("curl")
356
    cmd = """
357
    echo 'APT::Install-Suggests "false";' >> /etc/apt/apt.conf
358
    curl -k https://dev.grnet.gr/files/apt-grnetdev.pub | apt-key add -
359
    """
360
    try_run(cmd)
361
    tmpl = "/etc/apt/sources.list.d/okeanos.list"
362
    replace = {}
363
    custom = customize_settings_from_tmpl(tmpl, replace)
364
    put(custom, tmpl)
365
    apt_get_update()
366

    
367

    
368
@roles("cyclades", "cms", "pithos", "accounts")
369
def restart_services():
370
    debug(env.host, " * Restarting apache2 and gunicorn...")
371
    try_run("/etc/init.d/gunicorn restart")
372
    try_run("/etc/init.d/apache2 restart")
373

    
374

    
375
def setup_gunicorn():
376
    debug(env.host, " * Setting up gunicorn...")
377
    install_package("gunicorn")
378
    tmpl = "/etc/gunicorn.d/synnefo"
379
    replace = {}
380
    custom = customize_settings_from_tmpl(tmpl, replace)
381
    put(custom, tmpl, mode=0644)
382
    try_run("/etc/init.d/gunicorn restart")
383

    
384

    
385
def setup_apache():
386
    debug(env.host, " * Setting up apache2...")
387
    host_info = env.env.ips_info[env.host]
388
    install_package("apache2")
389
    tmpl = "/etc/apache2/sites-available/synnefo"
390
    replace = {
391
        "HOST": host_info.fqdn,
392
    }
393
    custom = customize_settings_from_tmpl(tmpl, replace)
394
    put(custom, tmpl)
395
    tmpl = "/etc/apache2/sites-available/synnefo-ssl"
396
    custom = customize_settings_from_tmpl(tmpl, replace)
397
    put(custom, tmpl)
398
    cmd = """
399
    a2enmod ssl
400
    a2enmod rewrite
401
    a2dissite default
402
    a2ensite synnefo
403
    a2ensite synnefo-ssl
404
    a2enmod headers
405
    a2enmod proxy_http
406
    a2dismod autoindex
407
    """
408
    try_run(cmd)
409
    try_run("/etc/init.d/apache2 restart")
410

    
411

    
412
@roles("mq")
413
def setup_mq():
414
    debug(env.host, "Setting up RabbitMQ...")
415
    install_package("rabbitmq-server")
416
    cmd = """
417
    rabbitmqctl add_user {0} {1}
418
    rabbitmqctl set_permissions {0} ".*" ".*" ".*"
419
    rabbitmqctl delete_user guest
420
    rabbitmqctl set_user_tags {0} administrator
421
    """.format(env.env.synnefo_user, env.env.synnefo_rabbitmq_passwd)
422
    try_run(cmd)
423
    try_run("/etc/init.d/rabbitmq-server restart")
424

    
425

    
426
@roles("db")
427
def allow_access_in_db(ip, user="all", method="md5"):
428
    cmd = """
429
    echo host all {0} {1}/32 {2} >> /etc/postgresql/8.4/main/pg_hba.conf
430
    """.format(user, ip, method)
431
    try_run(cmd)
432
    cmd = """
433
    sed -i 's/\(host.*127.0.0.1.*\)md5/\\1trust/' /etc/postgresql/8.4/main/pg_hba.conf
434
    """
435
    try_run(cmd)
436
    try_run("/etc/init.d/postgresql restart")
437

    
438
@roles("db")
439
def setup_db():
440
    debug(env.host, "Setting up DataBase server...")
441
    install_package("postgresql")
442

    
443
    tmpl = "/tmp/db-init.psql"
444
    replace = {
445
        "synnefo_user": env.env.synnefo_user,
446
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
447
        }
448
    custom = customize_settings_from_tmpl(tmpl, replace)
449
    put(custom, tmpl)
450
    cmd = 'su - postgres -c "psql -w -f %s" ' % tmpl
451
    try_run(cmd)
452
    cmd = """
453
    echo "listen_addresses = '*'" >> /etc/postgresql/8.4/main/postgresql.conf
454
    """
455
    try_run(cmd)
456

    
457
    if env.env.testing_vm:
458
        cmd = """
459
        echo "fsync=off\nsynchronous_commit=off\nfull_page_writes=off" >> /etc/postgresql/8.4/main/postgresql.conf
460
        """
461
        try_run(cmd)
462

    
463
    allow_access_in_db(env.host, "all", "trust")
464
    try_run("/etc/init.d/postgresql restart")
465

    
466

    
467
@roles("db")
468
def destroy_db():
469
    try_run("""su - postgres -c ' psql -w -c "drop database snf_apps" '""")
470
    try_run("""su - postgres -c ' psql -w -c "drop database snf_pithos" '""")
471

    
472

    
473
def setup_webproject():
474
    debug(env.host, " * Setting up snf-webproject...")
475
    with settings(hide("everything")):
476
        try_run("ping -c1 " + env.env.db.ip)
477
    setup_common()
478
    install_package("snf-webproject")
479
    install_package("python-psycopg2")
480
    install_package("python-gevent")
481
    tmpl = "/etc/synnefo/webproject.conf"
482
    replace = {
483
        "synnefo_user": env.env.synnefo_user,
484
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
485
        "db_node": env.env.db.ip,
486
        "domain": env.env.domain,
487
    }
488
    custom = customize_settings_from_tmpl(tmpl, replace)
489
    put(custom, tmpl, mode=0644)
490
    with settings(host_string=env.env.db.ip):
491
        host_info = env.env.ips_info[env.host]
492
        allow_access_in_db(host_info.ip, "all", "trust")
493
    try_run("/etc/init.d/gunicorn restart")
494

    
495

    
496
def setup_common():
497
    debug(env.host, " * Setting up snf-common...")
498
    host_info = env.env.ips_info[env.host]
499
    install_package("python-objpool")
500
    install_package("snf-common")
501
    install_package("python-astakosclient")
502
    install_package("snf-django-lib")
503
    install_package("snf-branding")
504
    tmpl = "/etc/synnefo/common.conf"
505
    replace = {
506
        #FIXME:
507
        "EMAIL_SUBJECT_PREFIX": env.host,
508
        "domain": env.env.domain,
509
        "HOST": host_info.fqdn,
510
    }
511
    custom = customize_settings_from_tmpl(tmpl, replace)
512
    put(custom, tmpl, mode=0644)
513
    try_run("/etc/init.d/gunicorn restart")
514

    
515
@roles("accounts")
516
def astakos_loaddata():
517
    debug(env.host, " * Loading initial data to astakos...")
518
    cmd = """
519
    snf-manage loaddata groups
520
    """
521
    try_run(cmd)
522

    
523

    
524
@roles("accounts")
525
def astakos_register_services():
526
    debug(env.host, " * Register services in astakos...")
527

    
528
    cyclades_base_url = "https://%s/cyclades/" % env.env.cyclades.fqdn
529
    pithos_base_url = "https://%s/pithos/" % env.env.pithos.fqdn
530
    astakos_base_url = "https://%s/astakos/" % env.env.accounts.fqdn
531

    
532
    cmd = """
533
    snf-manage component-add "home" https://{0} home-icon.png
534
    snf-manage component-add "cyclades" {1}ui/
535
    snf-manage component-add "pithos" {2}ui/
536
    snf-manage component-add "astakos" {3}ui/
537
    """.format(env.env.cms.fqdn, cyclades_base_url,
538
               pithos.base_url, astakos_base_url)
539
    try_run(cmd)
540
    import_service("astakos", astakos_base_url)
541
    import_service("pithos", pithos_base_url)
542
    import_service("cyclades", cyclades_base_url)
543
    cmd = """
544
    snf-manage resource-modify --limit 40G pithos.diskspace
545
    snf-manage resource-modify --limit 2 astakos.pending_app
546
    snf-manage resource-modify --limit 4 cyclades.vm
547
    snf-manage resource-modify --limit 40G cyclades.disk
548
    snf-manage resource-modify --limit 8G cyclades.ram
549
    snf-manage resource-modify --limit 16 cyclades.cpu
550
    snf-manage resource-modify --limit 4 cyclades.network.private
551
    """
552
    try_run(cmd)
553

    
554

    
555
@roles("accounts")
556
def add_user():
557
    debug(env.host, " * adding user %s to astakos..." % env.env.user_email)
558
    email=env.env.user_email
559
    name=env.env.user_name
560
    lastname=env.env.user_lastname
561
    passwd=env.env.user_passwd
562
    cmd = """
563
    snf-manage user-add {0} {1} {2}
564
    """.format(email, name, lastname)
565
    try_run(cmd)
566
    with settings(host_string=env.env.db.ip):
567
        uid, user_auth_token, user_uuid = get_auth_token_from_db(email)
568
    cmd = """
569
    snf-manage user-modify --password {0} {1}
570
    """.format(passwd, uid)
571
    try_run(cmd)
572

    
573

    
574
@roles("accounts")
575
def activate_user(user_email=None):
576
    if not user_email:
577
      user_email = env.env.user_email
578
    debug(env.host, " * Activate user %s..." % user_email)
579
    with settings(host_string=env.env.db.ip):
580
        uid, user_auth_token, user_uuid = get_auth_token_from_db(user_email)
581

    
582
    cmd = """
583
    snf-manage user-modify --verify {0}
584
    snf-manage user-modify --accept {0}
585
    """.format(uid)
586
    try_run(cmd)
587

    
588
@roles("accounts")
589
def setup_astakos():
590
    debug(env.host, "Setting up snf-astakos-app...")
591
    setup_gunicorn()
592
    setup_apache()
593
    setup_webproject()
594
    install_package("python-django-south")
595
    install_package("snf-astakos-app")
596
    install_package("kamaki")
597

    
598
    tmpl = "/etc/synnefo/astakos.conf"
599
    replace = {
600
      "ACCOUNTS": env.env.accounts.fqdn,
601
      "domain": env.env.domain,
602
      "CYCLADES": env.env.cyclades.fqdn,
603
      "PITHOS": env.env.pithos.fqdn,
604
    }
605
    custom = customize_settings_from_tmpl(tmpl, replace)
606
    put(custom, tmpl, mode=0644)
607
    if env.csrf_disable:
608
      cmd = """
609
cat <<EOF >> /etc/synnefo/astakos.conf
610
try:
611
  MIDDLEWARE_CLASSES.remove('django.middleware.csrf.CsrfViewMiddleware')
612
except:
613
  pass
614
EOF
615
"""
616
      try_run(cmd)
617

    
618
    try_run("/etc/init.d/gunicorn restart")
619

    
620
    cmd = """
621
    snf-manage syncdb --noinput
622
    snf-manage migrate im --delete-ghost-migrations
623
    snf-manage migrate quotaholder_app
624
    """
625
    try_run(cmd)
626

    
627

    
628
def import_service(service, base_url):
629
    try_run("snf-service-export %s %s | snf-manage service-import -" %
630
            (service, base_url))
631

    
632

    
633
@roles("accounts")
634
def get_service_details(service="pithos"):
635
    debug(env.host, " * Getting registered details for %s service..." % service)
636
    result = try_run("snf-manage component-list")
637
    r = re.compile(r".*%s.*" % service, re.M)
638
    service_id, _, _, service_token = r.search(result).group().split()
639
    # print("%s: %s %s" % (service, service_id, service_token))
640
    return (service_id, service_token)
641

    
642

    
643
@roles("db")
644
def get_auth_token_from_db(user_email=None):
645
    if not user_email:
646
        user_email=env.env.user_email
647
    debug(env.host, " * Getting authentication token and uuid for user %s..." % user_email)
648
    cmd = """
649
    echo "select id, auth_token, uuid, email from auth_user, im_astakosuser where auth_user.id = im_astakosuser.user_ptr_id and auth_user.email = '{0}';" > /tmp/psqlcmd
650
    su - postgres -c  "psql -w -d snf_apps -f /tmp/psqlcmd"
651
    """.format(user_email)
652

    
653
    result = try_run(cmd)
654
    r = re.compile(r"(\d+)[ |]*(\S+)[ |]*(\S+)[ |]*" + user_email, re.M)
655
    match = r.search(result)
656
    uid, user_auth_token, user_uuid = match.groups()
657
    # print("%s: %s %s %s" % ( user_email, uid, user_auth_token, user_uuid))
658

    
659
    return (uid, user_auth_token, user_uuid)
660

    
661

    
662
@roles("cms")
663
def cms_loaddata():
664
    debug(env.host, " * Loading cms initial data...")
665
    if env.cms_pass:
666
      debug(env.host, "Aborting. Prerequisites not met.")
667
      return
668
    tmpl = "/tmp/sites.json"
669
    replace = {}
670
    custom = customize_settings_from_tmpl(tmpl, replace)
671
    put(custom, tmpl)
672

    
673
    tmpl = "/tmp/page.json"
674
    replace = {}
675
    custom = customize_settings_from_tmpl(tmpl, replace)
676
    put(custom, tmpl)
677

    
678
    cmd = """
679
    snf-manage loaddata /tmp/sites.json
680
    snf-manage loaddata /tmp/page.json
681
    snf-manage createsuperuser --username=admin --email=admin@{0} --noinput
682
    """.format(env.env.domain)
683
    try_run(cmd)
684

    
685

    
686
@roles("cms")
687
def setup_cms():
688
    debug(env.host, "Setting up cms...")
689
    if env.cms_pass:
690
      debug(env.host, "Aborting. Prerequisites not met.")
691
      return
692
    with settings(hide("everything")):
693
        try_run("ping -c1 accounts." + env.env.domain)
694
    setup_gunicorn()
695
    setup_apache()
696
    setup_webproject()
697
    install_package("snf-cloudcms")
698

    
699
    tmpl = "/etc/synnefo/cms.conf"
700
    replace = {
701
        "ACCOUNTS": env.env.accounts.fqdn,
702
        }
703
    custom = customize_settings_from_tmpl(tmpl, replace)
704
    put(custom, tmpl, mode=0644)
705
    try_run("/etc/init.d/gunicorn restart")
706

    
707

    
708
    cmd = """
709
    snf-manage syncdb
710
    snf-manage migrate --delete-ghost-migrations
711
    """.format(env.env.domain)
712
    try_run(cmd)
713

    
714

    
715
def setup_nfs_dirs():
716
    debug(env.host, " * Creating NFS mount point for pithos and ganeti...")
717
    cmd = """
718
    mkdir -p {0}
719
    cd {0}
720
    mkdir -p data
721
    chown www-data:www-data data
722
    chmod g+ws data
723
    mkdir -p /srv/okeanos
724
    """.format(env.env.pithos_dir)
725
    try_run(cmd)
726

    
727

    
728
@roles("nodes")
729
def setup_nfs_clients():
730
    if env.host == env.env.pithos.ip:
731
      return
732

    
733
    debug(env.host, " * Mounting pithos NFS mount point...")
734
    with settings(hide("everything")):
735
        try_run("ping -c1 " + env.env.pithos.hostname)
736
    install_package("nfs-common")
737
    for d in [env.env.pithos_dir, "/srv/okeanos"]:
738
      try_run("mkdir -p " + d)
739
      cmd = """
740
      echo "{0}:/{1} {2}  nfs4 defaults,rw,noatime,nodiratime,intr,rsize=1048576,wsize=1048576,noacl" >> /etc/fstab
741
      """.format(env.env.pithos.hostname, os.path.basename(d), d)
742
      try_run(cmd)
743
      try_run("mount " + d)
744

    
745

    
746
@roles("pithos")
747
def setup_nfs_server():
748
    debug(env.host, " * Setting up NFS server for pithos...")
749
    setup_nfs_dirs()
750
    install_package("nfs-kernel-server")
751
    tmpl = "/etc/exports"
752
    replace = {
753
      "pithos_dir": env.env.pithos_dir,
754
      "srv": os.path.dirname(env.env.pithos_dir),
755
      "subnet": env.env.subnet
756
      }
757
    custom = customize_settings_from_tmpl(tmpl, replace)
758
    put(custom, tmpl)
759
    try_run("/etc/init.d/nfs-kernel-server restart")
760

    
761

    
762
@roles("pithos")
763
def setup_pithos():
764
    debug(env.host, "Setting up snf-pithos-app...")
765
    with settings(hide("everything")):
766
        try_run("ping -c1 accounts." + env.env.domain)
767
        try_run("ping -c1 " + env.env.db.ip)
768
    setup_gunicorn()
769
    setup_apache()
770
    setup_webproject()
771

    
772
    with settings(host_string=env.env.accounts.ip):
773
        service_id, service_token = get_service_details("pithos")
774

    
775
    install_package("kamaki")
776
    install_package("snf-pithos-backend")
777
    install_package("snf-pithos-app")
778
    tmpl = "/etc/synnefo/pithos.conf"
779
    replace = {
780
        "ACCOUNTS": env.env.accounts.fqdn,
781
        "PITHOS": env.env.pithos.fqdn,
782
        "db_node": env.env.db.ip,
783
        "synnefo_user": env.env.synnefo_user,
784
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
785
        "pithos_dir": env.env.pithos_dir,
786
        "PITHOS_SERVICE_TOKEN": service_token,
787
        "proxy": env.env.pithos.hostname == env.env.accounts.hostname
788
        }
789
    custom = customize_settings_from_tmpl(tmpl, replace)
790
    put(custom, tmpl, mode=0644)
791
    try_run("/etc/init.d/gunicorn restart")
792

    
793
    install_package("snf-pithos-webclient")
794
    tmpl = "/etc/synnefo/webclient.conf"
795
    replace = {
796
        "ACCOUNTS": env.env.accounts.fqdn,
797
        "PITHOS_UI_CLOUDBAR_ACTIVE_SERVICE": service_id,
798
        }
799
    custom = customize_settings_from_tmpl(tmpl, replace)
800
    put(custom, tmpl, mode=0644)
801

    
802
    try_run("/etc/init.d/gunicorn restart")
803
    #TOFIX: the previous command lets pithos-backend create blocks and maps
804
    #       with root owner
805
    try_run("chown -R www-data:www-data %s/data " % env.env.pithos_dir)
806
    #try_run("pithos-migrate stamp 4c8ccdc58192")
807
    #try_run("pithos-migrate upgrade head")
808

    
809

    
810
def add_wheezy():
811
    tmpl = "/etc/apt/sources.list.d/wheezy.list"
812
    replace = {}
813
    custom = customize_settings_from_tmpl(tmpl, replace)
814
    put(custom, tmpl)
815
    apt_get_update()
816

    
817

    
818
def remove_wheezy():
819
    try_run("rm -f /etc/apt/sources.list.d/wheezy.list")
820
    apt_get_update()
821

    
822

    
823
@roles("ganeti")
824
def setup_ganeti():
825
    debug(env.host, "Setting up snf-ganeti...")
826
    node_info = env.env.ips_info[env.host]
827
    with settings(hide("everything")):
828
        #if env.enable_lvm:
829
        #    try_run("vgs " + env.env.vg)
830
        try_run("getent hosts " + env.env.cluster.fqdn)
831
        try_run("getent hosts %s | grep -v ^127" % env.host)
832
        try_run("hostname -f | grep " + node_info.fqdn)
833
        #try_run("ip link show " + env.env.common_bridge)
834
        #try_run("ip link show " + env.env.common_bridge)
835
        #try_run("apt-get update")
836
    install_package("qemu-kvm")
837
    install_package("python-bitarray")
838
    add_wheezy()
839
    install_package("ganeti-htools")
840
    remove_wheezy()
841
    install_package("snf-ganeti")
842
    try_run("mkdir -p /srv/ganeti/file-storage/")
843
    cmd = """
844
cat <<EOF > /etc/ganeti/file-storage-paths
845
/srv/ganeti/file-storage
846
/srv/ganeti/shared-file-storage
847
EOF
848
"""
849
    try_run(cmd)
850

    
851

    
852
@roles("master")
853
def add_rapi_user():
854
    debug(env.host, " * Adding RAPI user to Ganeti backend...")
855
    cmd = """
856
    echo -n "{0}:Ganeti Remote API:{1}" | openssl md5
857
    """.format(env.env.synnefo_user, env.env.synnefo_rapi_passwd)
858
    result = try_run(cmd)
859
    cmd = """
860
    echo "{0} {1}{2} write" >> /var/lib/ganeti/rapi/users
861
    """.format(env.env.synnefo_user, '{ha1}',result)
862
    try_run(cmd)
863
    try_run("/etc/init.d/ganeti restart")
864

    
865
@roles("master")
866
def add_nodes():
867
    nodes = env.env.cluster_nodes.split(",")
868
    nodes.remove(env.env.master_node)
869
    debug(env.host, " * Adding nodes to Ganeti backend...")
870
    for n in nodes:
871
        add_node(n)
872

    
873
@roles("master")
874
def add_node(node):
875
    node_info = env.env.nodes_info[node]
876
    debug(env.host, " * Adding node %s to Ganeti backend..." % node_info.fqdn)
877
    cmd = "gnt-node add --no-ssh-key-check --master-capable=yes --vm-capable=yes " + node_info.fqdn
878
    try_run(cmd)
879

    
880
@roles("ganeti")
881
def enable_drbd():
882
    if env.enable_drbd:
883
        debug(env.host, " * Enabling DRBD...")
884
        try_run("modprobe drbd minor_count=255 usermode_helper=/bin/true")
885
        try_run("echo drbd minor_count=255 usermode_helper=/bin/true >> /etc/modules")
886

    
887
@roles("master")
888
def setup_drbd_dparams():
889
    if env.enable_drbd:
890
        debug(env.host, " * Twicking drbd related disk parameters in Ganeti...")
891
        cmd = """
892
        gnt-cluster modify --disk-parameters=drbd:metavg={0}
893
        gnt-group modify --disk-parameters=drbd:metavg={0} default
894
        """.format(env.env.vg)
895
        try_run(cmd)
896

    
897
@roles("master")
898
def enable_lvm():
899
    if env.enable_lvm:
900
        debug(env.host, " * Enabling LVM...")
901
        cmd = """
902
        gnt-cluster modify --vg-name={0}
903
        """.format(env.env.vg)
904
        try_run(cmd)
905
    else:
906
        debug(env.host, " * Disabling LVM...")
907
        try_run("gnt-cluster modify --no-lvm-storage")
908

    
909
@roles("master")
910
def destroy_cluster():
911
    debug(env.host, " * Destroying Ganeti cluster...")
912
    #TODO: remove instances first
913
    allnodes = env.env.cluster_hostnames[:]
914
    allnodes.remove(env.host)
915
    for n in allnodes:
916
      host_info = env.env.ips_info[host]
917
      debug(env.host, " * Removing node %s..." % n)
918
      cmd = "gnt-node remove  " + host_info.fqdn
919
      try_run(cmd)
920
    try_run("gnt-cluster destroy --yes-do-it")
921

    
922

    
923
@roles("master")
924
def init_cluster():
925
    debug(env.host, " * Initializing Ganeti backend...")
926
    # extra = ""
927
    # if env.enable_lvm:
928
    #     extra += " --vg-name={0} ".format(env.env.vg)
929
    # else:
930
    #     extra += " --no-lvm-storage "
931
    # if not env.enable_drbd:
932
    #     extra += " --no-drbd-storage "
933
    extra = " --no-lvm-storage --no-drbd-storage "
934
    cmd = """
935
    gnt-cluster init --enabled-hypervisors=kvm \
936
                     {0} \
937
                     --nic-parameters link={1},mode=bridged \
938
                     --master-netdev {2} \
939
                     --default-iallocator hail \
940
                     --hypervisor-parameters kvm:kernel_path=,vnc_bind_address=0.0.0.0 \
941
                     --no-ssh-init --no-etc-hosts \
942
                    {3}
943

944
    """.format(extra, env.env.common_bridge,
945
               env.env.cluster_netdev, env.env.cluster.fqdn)
946
    try_run(cmd)
947

    
948

    
949
@roles("ganeti")
950
def debootstrap():
951
    install_package("ganeti-instance-debootstrap")
952

    
953

    
954
@roles("ganeti")
955
def setup_image_host():
956
    debug(env.host, "Setting up snf-image...")
957
    install_package("snf-pithos-backend")
958
    install_package("snf-image")
959
    try_run("mkdir -p /srv/okeanos")
960
    tmpl = "/etc/default/snf-image"
961
    replace = {
962
        "synnefo_user": env.env.synnefo_user,
963
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
964
        "pithos_dir": env.env.pithos_dir,
965
        "db_node": env.env.db.ip,
966
    }
967
    custom = customize_settings_from_tmpl(tmpl, replace)
968
    put(custom, tmpl)
969

    
970

    
971
@roles("ganeti")
972
def setup_image_helper():
973
    debug(env.host, " * Updating helper image...")
974
    cmd = """
975
    snf-image-update-helper -y
976
    """
977
    try_run(cmd)
978

    
979

    
980
@roles("ganeti")
981
def setup_gtools():
982
    debug(env.host, " * Setting up snf-cyclades-gtools...")
983
    with settings(hide("everything")):
984
        try_run("ping -c1 " + env.env.mq.ip)
985
    setup_common()
986
    install_package("snf-cyclades-gtools")
987
    tmpl = "/etc/synnefo/gtools.conf"
988
    replace = {
989
        "synnefo_user": env.env.synnefo_user,
990
        "synnefo_rabbitmq_passwd": env.env.synnefo_rabbitmq_passwd,
991
        "mq_node": env.env.mq.ip,
992
    }
993
    custom = customize_settings_from_tmpl(tmpl, replace)
994
    put(custom, tmpl)
995

    
996
    cmd = """
997
    sed -i 's/false/true/' /etc/default/snf-ganeti-eventd
998
    /etc/init.d/snf-ganeti-eventd start
999
    """
1000
    try_run(cmd)
1001

    
1002

    
1003
@roles("ganeti")
1004
def setup_iptables():
1005
    debug(env.host, " * Setting up iptables to mangle DHCP requests...")
1006
    cmd = """
1007
    iptables -t mangle -A PREROUTING -i br+ -p udp -m udp --dport 67 -j NFQUEUE --queue-num 42
1008
    iptables -t mangle -A PREROUTING -i tap+ -p udp -m udp --dport 67 -j NFQUEUE --queue-num 42
1009
    iptables -t mangle -A PREROUTING -i prv+ -p udp -m udp --dport 67 -j NFQUEUE --queue-num 42
1010

1011
    ip6tables -t mangle -A PREROUTING -i br+ -p ipv6-icmp -m icmp6 --icmpv6-type 133 -j NFQUEUE --queue-num 43
1012
    ip6tables -t mangle -A PREROUTING -i br+ -p ipv6-icmp -m icmp6 --icmpv6-type 135 -j NFQUEUE --queue-num 44
1013
    """
1014
    try_run(cmd)
1015

    
1016
@roles("ganeti")
1017
def setup_network():
1018
    debug(env.host, "Setting up networking for Ganeti instances (nfdhcpd, etc.)...")
1019
    install_package("nfqueue-bindings-python")
1020
    install_package("nfdhcpd")
1021
    tmpl = "/etc/nfdhcpd/nfdhcpd.conf"
1022
    replace = {
1023
      "ns_node_ip": env.env.ns.ip
1024
      }
1025
    custom = customize_settings_from_tmpl(tmpl, replace)
1026
    put(custom, tmpl)
1027
    try_run("/etc/init.d/nfdhcpd restart")
1028

    
1029
    install_package("snf-network")
1030
    cmd = """
1031
    sed -i 's/MAC_MASK.*/MAC_MASK = ff:ff:f0:00:00:00/' /etc/default/snf-network
1032
    """
1033
    try_run(cmd)
1034

    
1035

    
1036
@roles("router")
1037
def setup_router():
1038
    debug(env.host, " * Setting up internal router for NAT...")
1039
    cmd = """
1040
    echo 1 > /proc/sys/net/ipv4/ip_forward
1041
    iptables -t nat -A POSTROUTING -s {0} -o {3} -j MASQUERADE
1042
    ip addr add {1} dev {2}
1043
    ip route add {0} dev {2} src {1}
1044
    """.format(env.env.synnefo_public_network_subnet,
1045
               env.env.synnefo_public_network_gateway,
1046
               env.env.common_bridge, env.env.public_iface)
1047
    try_run(cmd)
1048

    
1049

    
1050
@roles("cyclades")
1051
def cyclades_loaddata():
1052
    debug(env.host, " * Loading initial data for cyclades...")
1053
    try_run("snf-manage flavor-create %s %s %s %s" % (env.env.flavor_cpu,
1054
                                                      env.env.flavor_ram,
1055
                                                      env.env.flavor_disk,
1056
                                                      env.env.flavor_storage))
1057
    #run("snf-manage loaddata flavors")
1058

    
1059

    
1060
@roles("cyclades")
1061
def setup_cyclades():
1062
    debug(env.host, "Setting up snf-cyclades-app...")
1063
    with settings(hide("everything")):
1064
        try_run("ping -c1 accounts." + env.env.domain)
1065
        try_run("ping -c1 " + env.env.db.ip)
1066
        try_run("ping -c1 " + env.env.mq.ip)
1067
    setup_gunicorn()
1068
    setup_apache()
1069
    setup_webproject()
1070
    install_package("memcached")
1071
    install_package("python-memcache")
1072
    install_package("snf-pithos-backend")
1073
    install_package("kamaki")
1074
    install_package("snf-cyclades-app")
1075
    install_package("python-django-south")
1076
    tmpl = "/etc/synnefo/cyclades.conf"
1077

    
1078
    with settings(host_string=env.env.accounts.ip):
1079
        service_id, service_token = get_service_details("cyclades")
1080

    
1081
    replace = {
1082
        "ACCOUNTS": env.env.accounts.fqdn,
1083
        "CYCLADES": env.env.cyclades.fqdn,
1084
        "mq_node": env.env.mq.ip,
1085
        "db_node": env.env.db.ip,
1086
        "synnefo_user": env.env.synnefo_user,
1087
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
1088
        "synnefo_rabbitmq_passwd": env.env.synnefo_rabbitmq_passwd,
1089
        "pithos_dir": env.env.pithos_dir,
1090
        "common_bridge": env.env.common_bridge,
1091
        "HOST": env.env.cyclades.ip,
1092
        "domain": env.env.domain,
1093
        "CYCLADES_SERVICE_TOKEN": service_token,
1094
        "proxy": env.env.cyclades.hostname == env.env.accounts.hostname
1095
        }
1096
    custom = customize_settings_from_tmpl(tmpl, replace)
1097
    put(custom, tmpl, mode=0644)
1098
    try_run("/etc/init.d/gunicorn restart")
1099

    
1100
    cmd = """
1101
    sed -i 's/false/true/' /etc/default/snf-dispatcher
1102
    /etc/init.d/snf-dispatcher start
1103
    """
1104
    try_run(cmd)
1105

    
1106
    try_run("snf-manage syncdb")
1107
    try_run("snf-manage migrate --delete-ghost-migrations")
1108

    
1109

    
1110
@roles("cyclades")
1111
def get_backend_id(cluster_name="ganeti1.synnefo.deploy.local"):
1112
    backend_id = try_run("snf-manage backend-list 2>/dev/null | grep %s | awk '{print $1}'" % cluster_name)
1113
    return backend_id
1114

    
1115

    
1116
@roles("cyclades")
1117
def add_backend():
1118
    debug(env.host, "adding %s ganeti backend to cyclades..." % env.env.cluster.fqdn)
1119
    with settings(hide("everything")):
1120
        try_run("ping -c1 " + env.env.cluster.fqdn)
1121
    cmd = """
1122
    snf-manage backend-add --clustername={0} --user={1} --pass={2}
1123
    """.format(env.env.cluster.fqdn, env.env.synnefo_user,
1124
               env.env.synnefo_rapi_passwd)
1125
    try_run(cmd)
1126
    backend_id = get_backend_id(env.env.cluster.fqdn)
1127
    try_run("snf-manage backend-modify --drained=False " + backend_id)
1128

    
1129
@roles("cyclades")
1130
def pin_user_to_backend(user_email):
1131
    backend_id = get_backend_id(env.env.cluster.fqdn)
1132
    # pin user to backend
1133
    cmd = """
1134
cat <<EOF >> /etc/synnefo/cyclades.conf
1135

1136
BACKEND_PER_USER = {
1137
  '%s': %s,
1138
}
1139

1140
EOF
1141
/etc/init.d/gunicorn restart
1142
    """  % (user_email, backend_id)
1143
    try_run(cmd)
1144

    
1145
@roles("cyclades")
1146
def add_pools():
1147
    debug(env.host, " * Creating pools of resources (brigdes, mac prefixes) in cyclades...")
1148
    try_run("snf-manage pool-create --type=mac-prefix --base=aa:00:0 --size=65536")
1149
    try_run("snf-manage pool-create --type=bridge --base=prv --size=20")
1150

    
1151

    
1152
@roles("accounts", "cyclades", "pithos")
1153
def export_services():
1154
    debug(env.host, " * Exporting services...")
1155
    host = env.host
1156
    services = []
1157
    if host == env.env.cyclades.ip:
1158
        services.append("cyclades")
1159
    if host == env.env.pithos.ip:
1160
        services.append("pithos")
1161
    if host == env.env.accounts.ip:
1162
        services.append("astakos")
1163
    for service in services:
1164
        filename = "%s_services.json" % service
1165
        cmd = "snf-manage service-export-%s > %s" % (service, filename)
1166
        run(cmd)
1167
        get(filename, filename+".local")
1168

    
1169

    
1170
@roles("accounts")
1171
def import_services():
1172
    debug(env.host, " * Registering services to astakos...")
1173
    for service in ["cyclades", "pithos", "astakos"]:
1174
        filename = "%s_services.json" % service
1175
        put(filename +".local", filename)
1176
        cmd = "snf-manage service-import --json=%s" % filename
1177
        run(cmd)
1178

    
1179
    debug(env.host, " * Setting default quota...")
1180
    cmd = """
1181
    snf-manage resource-modify --limit 40G pithos.diskspace
1182
    snf-manage resource-modify --limit 2 astakos.pending_app
1183
    snf-manage resource-modify --limit 4 cyclades.vm
1184
    snf-manage resource-modify --limit 40G cyclades.disk
1185
    snf-manage resource-modify --limit 16G cyclades.ram
1186
    snf-manage resource-modify --limit 8G cyclades.active_ram
1187
    snf-manage resource-modify --limit 32 cyclades.cpu
1188
    snf-manage resource-modify --limit 16 cyclades.active_cpu
1189
    snf-manage resource-modify --limit 4 cyclades.network.private
1190
    """
1191
    try_run(cmd)
1192

    
1193

    
1194
@roles("cyclades")
1195
def add_network():
1196
    debug(env.host, " * Adding public network in cyclades...")
1197
    backend_id = get_backend_id(env.env.cluster.fqdn)
1198
    cmd = """
1199
    snf-manage network-create --subnet={0} --gateway={1} --public --dhcp --flavor={2} --mode=bridged --link={3} --name=Internet --backend-id={4}
1200
    """.format(env.env.synnefo_public_network_subnet,
1201
               env.env.synnefo_public_network_gateway,
1202
               env.env.synnefo_public_network_type,
1203
               env.env.common_bridge, backend_id)
1204
    try_run(cmd)
1205

    
1206

    
1207
@roles("cyclades")
1208
def setup_vncauthproxy():
1209
    debug(env.host, " * Setting up vncauthproxy...")
1210
    install_package("snf-vncauthproxy")
1211
    cmd = """
1212
    echo CHUID="www-data:nogroup" >> /etc/default/vncauthproxy
1213
    rm /var/log/vncauthproxy/vncauthproxy.log
1214
    """
1215
    try_run(cmd)
1216
    try_run("/etc/init.d/vncauthproxy restart")
1217

    
1218
@roles("client")
1219
def setup_kamaki():
1220
    debug(env.host, "Setting up kamaki client...")
1221
    with settings(hide("everything")):
1222
        try_run("ping -c1 accounts." + env.env.domain)
1223
        try_run("ping -c1 cyclades." + env.env.domain)
1224
        try_run("ping -c1 pithos." + env.env.domain)
1225

    
1226
    with settings(host_string=env.env.db.ip):
1227
        uid, user_auth_token, user_uuid = get_auth_token_from_db(env.env.user_email)
1228

    
1229
    install_package("python-progress")
1230
    install_package("kamaki")
1231
    cmd = """
1232
    kamaki config set cloud.default.url "https://{0}/astakos/identity/v2.0/"
1233
    kamaki config set cloud.default.token {1}
1234
    """.format(env.env.accounts.fqdn, user_auth_token)
1235
    try_run(cmd)
1236
    try_run("kamaki file create images")
1237

    
1238
@roles("client")
1239
def upload_image(image="debian_base.diskdump"):
1240
    debug(env.host, " * Uploading initial image to pithos...")
1241
    image = "debian_base.diskdump"
1242
    try_run("wget {0} -O /tmp/{1}".format(env.env.debian_base_url, image))
1243
    try_run("kamaki file upload --container images /tmp/{0} {0}".format(image))
1244

    
1245
@roles("client")
1246
def register_image(image="debian_base.diskdump"):
1247
    debug(env.host, " * Register image to plankton...")
1248
    with settings(host_string=env.env.db.ip):
1249
        uid, user_auth_token, user_uuid = get_auth_token_from_db(env.env.user_email)
1250

    
1251
    image_location = "images:{0}".format(image)
1252
    cmd = """
1253
    sleep 5
1254
    kamaki image register "Debian Base" {0} --public --disk-format=diskdump --property OSFAMILY=linux --property ROOT_PARTITION=1 --property description="Debian Squeeze Base System" --property size=450M --property kernel=2.6.32 --property GUI="No GUI" --property sortorder=1 --property USERS=root --property OS=debian
1255
    """.format(image_location)
1256
    try_run(cmd)
1257

    
1258
@roles("client")
1259
def setup_burnin():
1260
    debug(env.host, "Setting up burnin testing tool...")
1261
    install_package("kamaki")
1262
    install_package("snf-tools")
1263

    
1264
@roles("pithos")
1265
def add_image_locally():
1266
    debug(env.host, " * Getting image locally in order snf-image to use it directly..")
1267
    image = "debian_base.diskdump"
1268
    try_run("wget {0} -O /srv/okeanos/{1}".format(env.env.debian_base_url, image))
1269

    
1270

    
1271
@roles("master")
1272
def gnt_instance_add(name="test"):
1273
    debug(env.host, " * Adding test instance to Ganeti...")
1274
    osp="""img_passwd=gamwtosecurity,img_format=diskdump,img_id=debian_base,img_properties='{"OSFAMILY":"linux"\,"ROOT_PARTITION":"1"}'"""
1275
    cmd = """
1276
    gnt-instance add  -o snf-image+default --os-parameters {0} -t plain --disk 0:size=1G --no-name-check --no-ip-check --net 0:ip=pool,network=test --no-install --hypervisor-parameters kvm:machine_version=pc-1.0 {1}
1277
    """.format(osp, name)
1278
    try_run(cmd)
1279

    
1280
@roles("master")
1281
def gnt_network_add(name="test", subnet="10.0.0.0/26", gw="10.0.0.1", mode="bridged", link="br0"):
1282
    debug(env.host, " * Adding test network to Ganeti...")
1283
    cmd = """
1284
    gnt-network add --network={1} --gateway={2} {0}
1285
    gnt-network connect {0} {3} {4}
1286
    """.format(name, subnet, gw, mode, link)
1287
    try_run(cmd)
1288

    
1289
@roles("ips")
1290
def test():
1291
    debug(env.host, "Testing...")
1292
    try_run("hostname && date")