Statistics
| Branch: | Tag: | Revision:

root / snf-deploy / fabfile.py @ e083e94c

History | View | Annotate | Download (39.9 kB)

1 ad76b118 Dimitris Aragiorgis
from __future__ import with_statement
2 ad76b118 Dimitris Aragiorgis
from fabric.api import *
3 ad76b118 Dimitris Aragiorgis
from fabric.contrib.console import confirm
4 ad76b118 Dimitris Aragiorgis
from random import choice
5 ad76b118 Dimitris Aragiorgis
from fabric.operations import run, put
6 ad76b118 Dimitris Aragiorgis
import re
7 ad76b118 Dimitris Aragiorgis
import shutil, os
8 ad76b118 Dimitris Aragiorgis
from functools import wraps
9 ad76b118 Dimitris Aragiorgis
import imp
10 ad76b118 Dimitris Aragiorgis
import ConfigParser
11 ad76b118 Dimitris Aragiorgis
import sys
12 ad76b118 Dimitris Aragiorgis
import tempfile
13 ad76b118 Dimitris Aragiorgis
import ast
14 ad76b118 Dimitris Aragiorgis
from snfdeploy.lib import *
15 ad76b118 Dimitris Aragiorgis
from snfdeploy import massedit
16 ad76b118 Dimitris Aragiorgis
17 ad76b118 Dimitris Aragiorgis
18 ad76b118 Dimitris Aragiorgis
def setup_env(confdir="conf", packages="packages",
19 e5b4db06 Dimitris Aragiorgis
              templates="files", cluster_name="ganeti1", autoconf=False, disable_colors=False, key_inject=False):
20 ad76b118 Dimitris Aragiorgis
    print("Loading configuration for synnefo...")
21 ad76b118 Dimitris Aragiorgis
    print(" * Using config files under %s..." % confdir)
22 ad76b118 Dimitris Aragiorgis
    print(" * Using %s and %s for packages and templates accordingly..." % (packages, templates))
23 ad76b118 Dimitris Aragiorgis
24 ad76b118 Dimitris Aragiorgis
    autoconf = ast.literal_eval(autoconf)
25 b7c00e75 Dionysis Grigoropoulos
    disable_colors = ast.literal_eval(disable_colors)
26 e5b4db06 Dimitris Aragiorgis
    env.key_inject = ast.literal_eval(key_inject)
27 ad76b118 Dimitris Aragiorgis
    conf = Conf.configure(confdir=confdir, cluster_name=cluster_name, autoconf=autoconf)
28 ad76b118 Dimitris Aragiorgis
    env.env = Env(conf)
29 ad76b118 Dimitris Aragiorgis
30 ad76b118 Dimitris Aragiorgis
    env.local = autoconf
31 ad76b118 Dimitris Aragiorgis
    env.password = env.env.password
32 ad76b118 Dimitris Aragiorgis
    env.user = env.env.user
33 ad76b118 Dimitris Aragiorgis
    env.shell = "/bin/bash -c"
34 ad76b118 Dimitris Aragiorgis
35 b7c00e75 Dionysis Grigoropoulos
    if disable_colors:
36 b7c00e75 Dionysis Grigoropoulos
        disable_color()
37 b7c00e75 Dionysis Grigoropoulos
38 ad76b118 Dimitris Aragiorgis
    if env.env.cms.hostname in [env.env.accounts.hostname, env.env.cyclades.hostname, env.env.pithos.hostname]:
39 ad76b118 Dimitris Aragiorgis
      env.cms_pass = True
40 ad76b118 Dimitris Aragiorgis
    else:
41 ad76b118 Dimitris Aragiorgis
      env.cms_pass = False
42 ad76b118 Dimitris Aragiorgis
43 ad76b118 Dimitris Aragiorgis
    if env.env.accounts.hostname in [env.env.cyclades.hostname, env.env.pithos.hostname]:
44 ad76b118 Dimitris Aragiorgis
      env.csrf_disable = True
45 ad76b118 Dimitris Aragiorgis
    else:
46 ad76b118 Dimitris Aragiorgis
      env.csrf_disable = False
47 ad76b118 Dimitris Aragiorgis
48 ad76b118 Dimitris Aragiorgis
49 ad76b118 Dimitris Aragiorgis
    env.roledefs = {
50 ad76b118 Dimitris Aragiorgis
        "nodes": env.env.ips,
51 ad76b118 Dimitris Aragiorgis
        "ips": env.env.ips,
52 ad76b118 Dimitris Aragiorgis
        "accounts": [env.env.accounts.ip],
53 ad76b118 Dimitris Aragiorgis
        "cyclades": [env.env.cyclades.ip],
54 ad76b118 Dimitris Aragiorgis
        "pithos": [env.env.pithos.ip],
55 ad76b118 Dimitris Aragiorgis
        "cms": [env.env.cms.ip],
56 ad76b118 Dimitris Aragiorgis
        "mq": [env.env.mq.ip],
57 ad76b118 Dimitris Aragiorgis
        "db": [env.env.db.ip],
58 ad76b118 Dimitris Aragiorgis
        "ns": [env.env.ns.ip],
59 ad76b118 Dimitris Aragiorgis
        "client": [env.env.client.ip],
60 ad76b118 Dimitris Aragiorgis
        "router": [env.env.router.ip],
61 ad76b118 Dimitris Aragiorgis
    }
62 ad76b118 Dimitris Aragiorgis
63 ad76b118 Dimitris Aragiorgis
    env.enable_lvm = False
64 ad76b118 Dimitris Aragiorgis
    env.enable_drbd = False
65 ad76b118 Dimitris Aragiorgis
    if ast.literal_eval(env.env.create_extra_disk) and env.env.extra_disk:
66 ad76b118 Dimitris Aragiorgis
        env.enable_lvm = True
67 ad76b118 Dimitris Aragiorgis
        env.enable_drbd = True
68 ad76b118 Dimitris Aragiorgis
69 ad76b118 Dimitris Aragiorgis
    env.roledefs.update({
70 ad76b118 Dimitris Aragiorgis
        "ganeti": env.env.cluster_ips,
71 ad76b118 Dimitris Aragiorgis
        "master": [env.env.master.ip],
72 ad76b118 Dimitris Aragiorgis
    })
73 ad76b118 Dimitris Aragiorgis
74 ad76b118 Dimitris Aragiorgis
75 ad76b118 Dimitris Aragiorgis
def install_package(package):
76 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Installing package %s..." % package)
77 ad76b118 Dimitris Aragiorgis
    APT_GET = "export DEBIAN_FRONTEND=noninteractive ;apt-get install -y --force-yes "
78 ad76b118 Dimitris Aragiorgis
79 f9b1abe8 Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
80 e083e94c Dimitris Aragiorgis
    env.env.update_packages(host_info.os)
81 ad76b118 Dimitris Aragiorgis
    if ast.literal_eval(env.env.use_local_packages):
82 ad76b118 Dimitris Aragiorgis
        with settings(warn_only=True):
83 c0c8263a Dimitris Aragiorgis
            deb = local("ls %s/%s*%s_all.deb" % (env.env.packages, package, host_info.os))
84 ad76b118 Dimitris Aragiorgis
            if deb:
85 ad76b118 Dimitris Aragiorgis
                debug(env.host, " * Package %s found in %s..." % (package, env.env.packages))
86 ad76b118 Dimitris Aragiorgis
                put(deb, "/tmp/")
87 e083e94c Dimitris Aragiorgis
                try_run("dpkg -i /tmp/%s || " % os.path.basename(deb) + APT_GET + "-f")
88 e083e94c Dimitris Aragiorgis
                try_run("rm /tmp/%s" % os.path.basename(deb))
89 ad76b118 Dimitris Aragiorgis
                return
90 ad76b118 Dimitris Aragiorgis
91 ad76b118 Dimitris Aragiorgis
    info = getattr(env.env, package)
92 e083e94c Dimitris Aragiorgis
    if info in ["squeeze-backports", "stable", "testing", "unstable", "wheezy"]:
93 ad76b118 Dimitris Aragiorgis
        APT_GET += " -t %s %s " % (info, package)
94 ad76b118 Dimitris Aragiorgis
    elif info:
95 ad76b118 Dimitris Aragiorgis
        APT_GET += " %s=%s " % (package, info)
96 ad76b118 Dimitris Aragiorgis
    else:
97 ad76b118 Dimitris Aragiorgis
        APT_GET += package
98 ad76b118 Dimitris Aragiorgis
99 ad76b118 Dimitris Aragiorgis
    try_run(APT_GET)
100 ad76b118 Dimitris Aragiorgis
101 ad76b118 Dimitris Aragiorgis
    return
102 ad76b118 Dimitris Aragiorgis
103 ad76b118 Dimitris Aragiorgis
104 ad76b118 Dimitris Aragiorgis
@roles("ns")
105 ad76b118 Dimitris Aragiorgis
def update_ns_for_ganeti():
106 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Updating name server entries for backend %s..." % env.env.cluster.fqdn)
107 ad76b118 Dimitris Aragiorgis
    update_arecord(env.env.cluster)
108 ad76b118 Dimitris Aragiorgis
    update_ptrrecord(env.env.cluster)
109 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/bind9 restart")
110 ad76b118 Dimitris Aragiorgis
111 ad76b118 Dimitris Aragiorgis
112 ad76b118 Dimitris Aragiorgis
@roles("ns")
113 ad76b118 Dimitris Aragiorgis
def update_ns_for_node(node):
114 ad76b118 Dimitris Aragiorgis
    info = env.env.nodes_info.get(node)
115 ad76b118 Dimitris Aragiorgis
    update_arecord(info)
116 ad76b118 Dimitris Aragiorgis
    update_ptrrecord(info)
117 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/bind9 restart")
118 ad76b118 Dimitris Aragiorgis
119 ad76b118 Dimitris Aragiorgis
120 ad76b118 Dimitris Aragiorgis
@roles("ns")
121 ad76b118 Dimitris Aragiorgis
def update_arecord(host):
122 ad76b118 Dimitris Aragiorgis
    filename = "/etc/bind/zones/" + env.env.domain
123 ad76b118 Dimitris Aragiorgis
    cmd = """
124 ad76b118 Dimitris Aragiorgis
    echo '{0}' >> {1}
125 ad76b118 Dimitris Aragiorgis
    """.format(host.arecord, filename)
126 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
127 ad76b118 Dimitris Aragiorgis
128 ad76b118 Dimitris Aragiorgis
129 ad76b118 Dimitris Aragiorgis
@roles("ns")
130 ad76b118 Dimitris Aragiorgis
def update_cnamerecord(host):
131 ad76b118 Dimitris Aragiorgis
    filename = "/etc/bind/zones/" + env.env.domain
132 ad76b118 Dimitris Aragiorgis
    cmd = """
133 ad76b118 Dimitris Aragiorgis
    echo '{0}' >> {1}
134 ad76b118 Dimitris Aragiorgis
    """.format(host.cnamerecord, filename)
135 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
136 ad76b118 Dimitris Aragiorgis
137 ad76b118 Dimitris Aragiorgis
138 ad76b118 Dimitris Aragiorgis
@roles("ns")
139 ad76b118 Dimitris Aragiorgis
def update_ptrrecord(host):
140 ad76b118 Dimitris Aragiorgis
    filename = "/etc/bind/rev/synnefo.in-addr.arpa.zone"
141 ad76b118 Dimitris Aragiorgis
    cmd = """
142 ad76b118 Dimitris Aragiorgis
    echo '{0}' >> {1}
143 ad76b118 Dimitris Aragiorgis
    """.format(host.ptrrecord, filename)
144 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
145 ad76b118 Dimitris Aragiorgis
146 ad76b118 Dimitris Aragiorgis
@roles("nodes")
147 ad76b118 Dimitris Aragiorgis
def apt_get_update():
148 ad76b118 Dimitris Aragiorgis
    debug(env.host, "apt-get update....")
149 ad76b118 Dimitris Aragiorgis
    try_run("apt-get update")
150 ad76b118 Dimitris Aragiorgis
151 ad76b118 Dimitris Aragiorgis
@roles("ns")
152 ad76b118 Dimitris Aragiorgis
def setup_ns():
153 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up name server..")
154 ad76b118 Dimitris Aragiorgis
    #WARNING: this should be remove after we are done
155 ad76b118 Dimitris Aragiorgis
    # because gevent does pick randomly nameservers and google does
156 ad76b118 Dimitris Aragiorgis
    # not know our setup!!!!!
157 ad76b118 Dimitris Aragiorgis
    apt_get_update()
158 ad76b118 Dimitris Aragiorgis
    install_package("bind9")
159 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/bind/named.conf.local"
160 ad76b118 Dimitris Aragiorgis
    replace = {
161 ad76b118 Dimitris Aragiorgis
      "domain": env.env.domain,
162 ad76b118 Dimitris Aragiorgis
      }
163 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
164 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
165 ad76b118 Dimitris Aragiorgis
166 ad76b118 Dimitris Aragiorgis
    try_run("mkdir -p /etc/bind/zones")
167 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/bind/zones/example.com"
168 ad76b118 Dimitris Aragiorgis
    replace = {
169 ad76b118 Dimitris Aragiorgis
      "domain": env.env.domain,
170 ad76b118 Dimitris Aragiorgis
      "ns_node_ip": env.env.ns.ip,
171 ad76b118 Dimitris Aragiorgis
      }
172 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
173 ad76b118 Dimitris Aragiorgis
    remote = "/etc/bind/zones/" + env.env.domain
174 ad76b118 Dimitris Aragiorgis
    put(custom, remote)
175 ad76b118 Dimitris Aragiorgis
176 ad76b118 Dimitris Aragiorgis
    try_run("mkdir -p /etc/bind/rev")
177 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/bind/rev/synnefo.in-addr.arpa.zone"
178 ad76b118 Dimitris Aragiorgis
    replace = {
179 ad76b118 Dimitris Aragiorgis
      "domain": env.env.domain,
180 ad76b118 Dimitris Aragiorgis
      }
181 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
182 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
183 ad76b118 Dimitris Aragiorgis
184 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/bind/named.conf.options"
185 ad76b118 Dimitris Aragiorgis
    replace = {
186 ad76b118 Dimitris Aragiorgis
      "NODE_IPS": ";".join(env.env.ips),
187 ad76b118 Dimitris Aragiorgis
      }
188 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
189 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
190 ad76b118 Dimitris Aragiorgis
191 ad76b118 Dimitris Aragiorgis
    for role, info in env.env.roles.iteritems():
192 ad76b118 Dimitris Aragiorgis
        if role == "ns":
193 ad76b118 Dimitris Aragiorgis
            continue
194 ad76b118 Dimitris Aragiorgis
        update_cnamerecord(info)
195 ad76b118 Dimitris Aragiorgis
    for node, info in env.env.nodes_info.iteritems():
196 ad76b118 Dimitris Aragiorgis
        update_arecord(info)
197 ad76b118 Dimitris Aragiorgis
        update_ptrrecord(info)
198 ad76b118 Dimitris Aragiorgis
199 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/bind9 restart")
200 ad76b118 Dimitris Aragiorgis
201 ad76b118 Dimitris Aragiorgis
202 ad76b118 Dimitris Aragiorgis
@roles("nodes")
203 ad76b118 Dimitris Aragiorgis
def check_dhcp():
204 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Checking IPs for synnefo..")
205 ad76b118 Dimitris Aragiorgis
    for n, info in env.env.nodes_info.iteritems():
206 de6f7d9b Dimitris Aragiorgis
        try_run("ping -c 1 " + info.ip, True)
207 ad76b118 Dimitris Aragiorgis
208 ad76b118 Dimitris Aragiorgis
@roles("nodes")
209 ad76b118 Dimitris Aragiorgis
def check_dns():
210 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Checking fqdns for synnefo..")
211 ad76b118 Dimitris Aragiorgis
    for n, info in env.env.nodes_info.iteritems():
212 de6f7d9b Dimitris Aragiorgis
        try_run("ping -c 1 " + info.fqdn, True)
213 ad76b118 Dimitris Aragiorgis
214 ad76b118 Dimitris Aragiorgis
    for n, info in env.env.roles.iteritems():
215 de6f7d9b Dimitris Aragiorgis
        try_run("ping -c 1 " + info.fqdn, True)
216 ad76b118 Dimitris Aragiorgis
217 ad76b118 Dimitris Aragiorgis
@roles("nodes")
218 ad76b118 Dimitris Aragiorgis
def check_connectivity():
219 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Checking internet connectivity..")
220 de6f7d9b Dimitris Aragiorgis
    try_run("ping -c 1 www.google.com", True)
221 ad76b118 Dimitris Aragiorgis
222 ad76b118 Dimitris Aragiorgis
223 ad76b118 Dimitris Aragiorgis
@roles("nodes")
224 ad76b118 Dimitris Aragiorgis
def check_ssh():
225 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Checking password-less ssh..")
226 ad76b118 Dimitris Aragiorgis
    for n, info in env.env.nodes_info.iteritems():
227 de6f7d9b Dimitris Aragiorgis
        try_run("ssh " + info.fqdn + "  date", True)
228 ad76b118 Dimitris Aragiorgis
229 ad76b118 Dimitris Aragiorgis
230 ad76b118 Dimitris Aragiorgis
@roles("ips")
231 ad76b118 Dimitris Aragiorgis
def add_keys():
232 e5b4db06 Dimitris Aragiorgis
    if not env.key_inject:
233 40d11d5f Dimitris Aragiorgis
      debug(env.host, "Skipping ssh keys injection..")
234 e5b4db06 Dimitris Aragiorgis
      return
235 e5b4db06 Dimitris Aragiorgis
    else:
236 e5b4db06 Dimitris Aragiorgis
      debug(env.host, "Adding rsa/dsa keys..")
237 ad76b118 Dimitris Aragiorgis
    try_run("mkdir -p /root/.ssh")
238 ad76b118 Dimitris Aragiorgis
    cmd = """
239 ad76b118 Dimitris Aragiorgis
for f in $(ls /root/.ssh/*); do
240 ad76b118 Dimitris Aragiorgis
  cp $f $f.bak
241 ad76b118 Dimitris Aragiorgis
done
242 ad76b118 Dimitris Aragiorgis
    """
243 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
244 ad76b118 Dimitris Aragiorgis
    files = ["authorized_keys", "id_dsa", "id_dsa.pub",
245 ad76b118 Dimitris Aragiorgis
             "id_rsa", "id_rsa.pub"]
246 ad76b118 Dimitris Aragiorgis
    for f in files:
247 ad76b118 Dimitris Aragiorgis
      tmpl = "/root/.ssh/" + f
248 ad76b118 Dimitris Aragiorgis
      replace = {}
249 ad76b118 Dimitris Aragiorgis
      custom = customize_settings_from_tmpl(tmpl, replace)
250 e9d8016c Dimitris Aragiorgis
      put(custom, tmpl, mode=0600)
251 ad76b118 Dimitris Aragiorgis
252 ad76b118 Dimitris Aragiorgis
    cmd = """
253 ad76b118 Dimitris Aragiorgis
if [ -e /root/.ssh/authorized_keys.bak ]; then
254 ad76b118 Dimitris Aragiorgis
  cat /root/.ssh/authorized_keys.bak >> /root/.ssh/authorized_keys
255 ad76b118 Dimitris Aragiorgis
fi
256 ad76b118 Dimitris Aragiorgis
    """
257 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Updating exising authorized keys..")
258 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
259 ad76b118 Dimitris Aragiorgis
260 ad76b118 Dimitris Aragiorgis
@roles("ips")
261 ad76b118 Dimitris Aragiorgis
def setup_resolv_conf():
262 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Tweak /etc/resolv.conf...")
263 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/network-manager stop")
264 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/dhcp/dhclient-enter-hooks.d/nodnsupdate"
265 ad76b118 Dimitris Aragiorgis
    replace = {}
266 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
267 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
268 ad76b118 Dimitris Aragiorgis
    try_run("cp /etc/resolv.conf /etc/resolv.conf.bak")
269 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/resolv.conf"
270 ad76b118 Dimitris Aragiorgis
    replace = {
271 ad76b118 Dimitris Aragiorgis
      "domain": env.env.domain,
272 ad76b118 Dimitris Aragiorgis
      "ns_node_ip": env.env.ns.ip,
273 ad76b118 Dimitris Aragiorgis
      }
274 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
275 176829d7 Dimitris Aragiorgis
    try:
276 176829d7 Dimitris Aragiorgis
      put(custom, tmpl)
277 176829d7 Dimitris Aragiorgis
    except:
278 176829d7 Dimitris Aragiorgis
      pass
279 ad76b118 Dimitris Aragiorgis
    try_run("chattr +i /etc/resolv.conf")
280 ad76b118 Dimitris Aragiorgis
281 ad76b118 Dimitris Aragiorgis
282 ad76b118 Dimitris Aragiorgis
@roles("ips")
283 ad76b118 Dimitris Aragiorgis
def setup_hosts():
284 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Tweaking /etc/hosts and ssh_config files...")
285 ad76b118 Dimitris Aragiorgis
    try_run("echo StrictHostKeyChecking no >> /etc/ssh/ssh_config")
286 5ef0bc03 Dimitris Aragiorgis
    cmd = " sed -i 's/^127.*/127.0.0.1 localhost/' /etc/hosts "
287 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
288 383f2efd Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
289 383f2efd Dimitris Aragiorgis
    cmd = "hostname %s" % host_info.hostname
290 383f2efd Dimitris Aragiorgis
    try_run(cmd)
291 383f2efd Dimitris Aragiorgis
    cmd = "echo %s > /etc/hostname" % host_info.hostname
292 383f2efd Dimitris Aragiorgis
    try_run(cmd)
293 ad76b118 Dimitris Aragiorgis
294 ad76b118 Dimitris Aragiorgis
295 de6f7d9b Dimitris Aragiorgis
def try_run(cmd, abort=False):
296 ad76b118 Dimitris Aragiorgis
    try:
297 ad76b118 Dimitris Aragiorgis
      if env.local:
298 ad76b118 Dimitris Aragiorgis
        return local(cmd, capture=True)
299 ad76b118 Dimitris Aragiorgis
      else:
300 ad76b118 Dimitris Aragiorgis
        return run(cmd)
301 ad76b118 Dimitris Aragiorgis
    except:
302 ad76b118 Dimitris Aragiorgis
      debug(env.host, "WARNING: command failed. Continuing anyway...")
303 de6f7d9b Dimitris Aragiorgis
      if abort:
304 de6f7d9b Dimitris Aragiorgis
        raise
305 ad76b118 Dimitris Aragiorgis
306 ad76b118 Dimitris Aragiorgis
def create_bridges():
307 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Creating bridges...")
308 ad76b118 Dimitris Aragiorgis
    install_package("bridge-utils")
309 ad76b118 Dimitris Aragiorgis
    cmd = """
310 ad76b118 Dimitris Aragiorgis
    brctl addbr {0} ; ip link set {0} up
311 ad76b118 Dimitris Aragiorgis
    """.format(env.env.common_bridge)
312 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
313 ad76b118 Dimitris Aragiorgis
314 ad76b118 Dimitris Aragiorgis
315 ad76b118 Dimitris Aragiorgis
def connect_bridges():
316 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Connecting bridges...")
317 ad76b118 Dimitris Aragiorgis
    cmd = """
318 ad76b118 Dimitris Aragiorgis
    brctl addif {0} {1}
319 ad76b118 Dimitris Aragiorgis
    """.format(env.env.common_bridge, env.env.public_iface)
320 ad76b118 Dimitris Aragiorgis
    #try_run(cmd)
321 ad76b118 Dimitris Aragiorgis
322 ad76b118 Dimitris Aragiorgis
323 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
324 ad76b118 Dimitris Aragiorgis
def setup_net_infra():
325 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setup networking infrastracture..")
326 ad76b118 Dimitris Aragiorgis
    create_bridges()
327 ad76b118 Dimitris Aragiorgis
    connect_bridges()
328 ad76b118 Dimitris Aragiorgis
329 ad76b118 Dimitris Aragiorgis
330 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
331 ad76b118 Dimitris Aragiorgis
def setup_lvm():
332 ad76b118 Dimitris Aragiorgis
    debug(env.host, "create volume group %s for ganeti.." % env.env.vg)
333 ad76b118 Dimitris Aragiorgis
    if env.enable_lvm:
334 ad76b118 Dimitris Aragiorgis
        install_package("lvm2")
335 ad76b118 Dimitris Aragiorgis
        cmd = """
336 ad76b118 Dimitris Aragiorgis
        pvcreate {0}
337 ad76b118 Dimitris Aragiorgis
        vgcreate {1} {0}
338 ad76b118 Dimitris Aragiorgis
        """.format(env.env.extra_disk, env.env.vg)
339 ad76b118 Dimitris Aragiorgis
        try_run(cmd)
340 ad76b118 Dimitris Aragiorgis
341 ad76b118 Dimitris Aragiorgis
342 ad76b118 Dimitris Aragiorgis
def customize_settings_from_tmpl(tmpl, replace):
343 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Customizing template %s..." % tmpl)
344 ad76b118 Dimitris Aragiorgis
    local = env.env.templates + tmpl
345 ad76b118 Dimitris Aragiorgis
    _, custom = tempfile.mkstemp()
346 ad76b118 Dimitris Aragiorgis
    shutil.copyfile(local, custom)
347 ad76b118 Dimitris Aragiorgis
    for k, v in replace.iteritems():
348 ad76b118 Dimitris Aragiorgis
        regex = "re.sub('%{0}%', '{1}', line)".format(k.upper(), v)
349 ad76b118 Dimitris Aragiorgis
        massedit.edit_files([custom], [regex], dry_run=False)
350 ad76b118 Dimitris Aragiorgis
351 ad76b118 Dimitris Aragiorgis
    return custom
352 ad76b118 Dimitris Aragiorgis
353 ad76b118 Dimitris Aragiorgis
354 ad76b118 Dimitris Aragiorgis
@roles("nodes")
355 ad76b118 Dimitris Aragiorgis
def setup_apt():
356 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up apt sources...")
357 ad76b118 Dimitris Aragiorgis
    install_package("curl")
358 ad76b118 Dimitris Aragiorgis
    cmd = """
359 ad76b118 Dimitris Aragiorgis
    echo 'APT::Install-Suggests "false";' >> /etc/apt/apt.conf
360 ad76b118 Dimitris Aragiorgis
    curl -k https://dev.grnet.gr/files/apt-grnetdev.pub | apt-key add -
361 ad76b118 Dimitris Aragiorgis
    """
362 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
363 f9b1abe8 Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
364 f9b1abe8 Dimitris Aragiorgis
    if host_info.os == "squeeze":
365 f9b1abe8 Dimitris Aragiorgis
      tmpl = "/etc/apt/sources.list.d/synnefo.squeeze.list"
366 f9b1abe8 Dimitris Aragiorgis
    else:
367 f9b1abe8 Dimitris Aragiorgis
      tmpl = "/etc/apt/sources.list.d/synnefo.wheezy.list"
368 ad76b118 Dimitris Aragiorgis
    replace = {}
369 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
370 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
371 ad76b118 Dimitris Aragiorgis
    apt_get_update()
372 ad76b118 Dimitris Aragiorgis
373 ad76b118 Dimitris Aragiorgis
374 ad76b118 Dimitris Aragiorgis
@roles("cyclades", "cms", "pithos", "accounts")
375 ad76b118 Dimitris Aragiorgis
def restart_services():
376 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Restarting apache2 and gunicorn...")
377 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
378 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/apache2 restart")
379 ad76b118 Dimitris Aragiorgis
380 ad76b118 Dimitris Aragiorgis
381 ad76b118 Dimitris Aragiorgis
def setup_gunicorn():
382 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up gunicorn...")
383 ad76b118 Dimitris Aragiorgis
    install_package("gunicorn")
384 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/gunicorn.d/synnefo"
385 ad76b118 Dimitris Aragiorgis
    replace = {}
386 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
387 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
388 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
389 ad76b118 Dimitris Aragiorgis
390 ad76b118 Dimitris Aragiorgis
391 ad76b118 Dimitris Aragiorgis
def setup_apache():
392 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up apache2...")
393 ad76b118 Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
394 ad76b118 Dimitris Aragiorgis
    install_package("apache2")
395 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/apache2/sites-available/synnefo"
396 ad76b118 Dimitris Aragiorgis
    replace = {
397 ad76b118 Dimitris Aragiorgis
        "HOST": host_info.fqdn,
398 ad76b118 Dimitris Aragiorgis
    }
399 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
400 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
401 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/apache2/sites-available/synnefo-ssl"
402 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
403 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
404 ad76b118 Dimitris Aragiorgis
    cmd = """
405 ad76b118 Dimitris Aragiorgis
    a2enmod ssl
406 ad76b118 Dimitris Aragiorgis
    a2enmod rewrite
407 ad76b118 Dimitris Aragiorgis
    a2dissite default
408 ad76b118 Dimitris Aragiorgis
    a2ensite synnefo
409 ad76b118 Dimitris Aragiorgis
    a2ensite synnefo-ssl
410 ad76b118 Dimitris Aragiorgis
    a2enmod headers
411 ad76b118 Dimitris Aragiorgis
    a2enmod proxy_http
412 ad76b118 Dimitris Aragiorgis
    a2dismod autoindex
413 ad76b118 Dimitris Aragiorgis
    """
414 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
415 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/apache2 restart")
416 ad76b118 Dimitris Aragiorgis
417 ad76b118 Dimitris Aragiorgis
418 ad76b118 Dimitris Aragiorgis
@roles("mq")
419 ad76b118 Dimitris Aragiorgis
def setup_mq():
420 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up RabbitMQ...")
421 ad76b118 Dimitris Aragiorgis
    install_package("rabbitmq-server")
422 ad76b118 Dimitris Aragiorgis
    cmd = """
423 ad76b118 Dimitris Aragiorgis
    rabbitmqctl add_user {0} {1}
424 ad76b118 Dimitris Aragiorgis
    rabbitmqctl set_permissions {0} ".*" ".*" ".*"
425 ad76b118 Dimitris Aragiorgis
    rabbitmqctl delete_user guest
426 ad76b118 Dimitris Aragiorgis
    rabbitmqctl set_user_tags {0} administrator
427 ad76b118 Dimitris Aragiorgis
    """.format(env.env.synnefo_user, env.env.synnefo_rabbitmq_passwd)
428 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
429 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/rabbitmq-server restart")
430 ad76b118 Dimitris Aragiorgis
431 ad76b118 Dimitris Aragiorgis
432 ad76b118 Dimitris Aragiorgis
@roles("db")
433 7474f035 Dimitris Aragiorgis
def allow_access_in_db(ip, user="all", method="md5"):
434 ad76b118 Dimitris Aragiorgis
    cmd = """
435 7474f035 Dimitris Aragiorgis
    echo host all {0} {1}/32 {2} >> /etc/postgresql/8.4/main/pg_hba.conf
436 7474f035 Dimitris Aragiorgis
    """.format(user, ip, method)
437 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
438 36848a52 Christos Stavrakakis
    cmd = """
439 525d8b20 Christos Stavrakakis
    sed -i 's/\(host.*127.0.0.1.*\)md5/\\1trust/' /etc/postgresql/8.4/main/pg_hba.conf
440 36848a52 Christos Stavrakakis
    """
441 36848a52 Christos Stavrakakis
    try_run(cmd)
442 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/postgresql restart")
443 ad76b118 Dimitris Aragiorgis
444 ad76b118 Dimitris Aragiorgis
@roles("db")
445 ad76b118 Dimitris Aragiorgis
def setup_db():
446 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up DataBase server...")
447 ad76b118 Dimitris Aragiorgis
    install_package("postgresql")
448 ad76b118 Dimitris Aragiorgis
449 ad76b118 Dimitris Aragiorgis
    tmpl = "/tmp/db-init.psql"
450 ad76b118 Dimitris Aragiorgis
    replace = {
451 ad76b118 Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
452 ad76b118 Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
453 ad76b118 Dimitris Aragiorgis
        }
454 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
455 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
456 ad76b118 Dimitris Aragiorgis
    cmd = 'su - postgres -c "psql -w -f %s" ' % tmpl
457 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
458 ad76b118 Dimitris Aragiorgis
    cmd = """
459 ad76b118 Dimitris Aragiorgis
    echo "listen_addresses = '*'" >> /etc/postgresql/8.4/main/postgresql.conf
460 ad76b118 Dimitris Aragiorgis
    """
461 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
462 ad76b118 Dimitris Aragiorgis
463 8ed8742f Christos Stavrakakis
    if env.env.testing_vm:
464 8ed8742f Christos Stavrakakis
        cmd = """
465 8ed8742f Christos Stavrakakis
        echo "fsync=off\nsynchronous_commit=off\nfull_page_writes=off" >> /etc/postgresql/8.4/main/postgresql.conf
466 8ed8742f Christos Stavrakakis
        """
467 8ed8742f Christos Stavrakakis
        try_run(cmd)
468 8ed8742f Christos Stavrakakis
469 7474f035 Dimitris Aragiorgis
    allow_access_in_db(env.host, "all", "trust")
470 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/postgresql restart")
471 ad76b118 Dimitris Aragiorgis
472 ad76b118 Dimitris Aragiorgis
473 ad76b118 Dimitris Aragiorgis
@roles("db")
474 ad76b118 Dimitris Aragiorgis
def destroy_db():
475 ad76b118 Dimitris Aragiorgis
    try_run("""su - postgres -c ' psql -w -c "drop database snf_apps" '""")
476 ad76b118 Dimitris Aragiorgis
    try_run("""su - postgres -c ' psql -w -c "drop database snf_pithos" '""")
477 ad76b118 Dimitris Aragiorgis
478 ad76b118 Dimitris Aragiorgis
479 ad76b118 Dimitris Aragiorgis
def setup_webproject():
480 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up snf-webproject...")
481 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
482 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.db.ip)
483 ad76b118 Dimitris Aragiorgis
    setup_common()
484 ad76b118 Dimitris Aragiorgis
    install_package("snf-webproject")
485 ad76b118 Dimitris Aragiorgis
    install_package("python-psycopg2")
486 ad76b118 Dimitris Aragiorgis
    install_package("python-gevent")
487 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/webproject.conf"
488 ad76b118 Dimitris Aragiorgis
    replace = {
489 ad76b118 Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
490 ad76b118 Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
491 ad76b118 Dimitris Aragiorgis
        "db_node": env.env.db.ip,
492 ad76b118 Dimitris Aragiorgis
        "domain": env.env.domain,
493 ad76b118 Dimitris Aragiorgis
    }
494 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
495 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
496 9b69ce64 Dimitris Aragiorgis
    with settings(host_string=env.env.db.ip):
497 ad76b118 Dimitris Aragiorgis
        host_info = env.env.ips_info[env.host]
498 7474f035 Dimitris Aragiorgis
        allow_access_in_db(host_info.ip, "all", "trust")
499 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
500 ad76b118 Dimitris Aragiorgis
501 ad76b118 Dimitris Aragiorgis
502 ad76b118 Dimitris Aragiorgis
def setup_common():
503 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up snf-common...")
504 ad76b118 Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
505 ad76b118 Dimitris Aragiorgis
    install_package("python-objpool")
506 ad76b118 Dimitris Aragiorgis
    install_package("snf-common")
507 ad76b118 Dimitris Aragiorgis
    install_package("python-astakosclient")
508 ad76b118 Dimitris Aragiorgis
    install_package("snf-django-lib")
509 ad76b118 Dimitris Aragiorgis
    install_package("snf-branding")
510 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/common.conf"
511 ad76b118 Dimitris Aragiorgis
    replace = {
512 ad76b118 Dimitris Aragiorgis
        #FIXME:
513 ad76b118 Dimitris Aragiorgis
        "EMAIL_SUBJECT_PREFIX": env.host,
514 ad76b118 Dimitris Aragiorgis
        "domain": env.env.domain,
515 ad76b118 Dimitris Aragiorgis
        "HOST": host_info.fqdn,
516 ad76b118 Dimitris Aragiorgis
    }
517 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
518 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
519 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
520 ad76b118 Dimitris Aragiorgis
521 ad76b118 Dimitris Aragiorgis
@roles("accounts")
522 ad76b118 Dimitris Aragiorgis
def astakos_loaddata():
523 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Loading initial data to astakos...")
524 ad76b118 Dimitris Aragiorgis
    cmd = """
525 ad76b118 Dimitris Aragiorgis
    snf-manage loaddata groups
526 ad76b118 Dimitris Aragiorgis
    """
527 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
528 ad76b118 Dimitris Aragiorgis
529 ad76b118 Dimitris Aragiorgis
530 ad76b118 Dimitris Aragiorgis
@roles("accounts")
531 b91452fa Giorgos Korfiatis
def astakos_register_services():
532 b91452fa Giorgos Korfiatis
    debug(env.host, " * Register services in astakos...")
533 b91452fa Giorgos Korfiatis
534 b91452fa Giorgos Korfiatis
    cyclades_base_url = "https://%s/cyclades/" % env.env.cyclades.fqdn
535 b91452fa Giorgos Korfiatis
    pithos_base_url = "https://%s/pithos/" % env.env.pithos.fqdn
536 b91452fa Giorgos Korfiatis
    astakos_base_url = "https://%s/astakos/" % env.env.accounts.fqdn
537 b91452fa Giorgos Korfiatis
538 ad76b118 Dimitris Aragiorgis
    cmd = """
539 ad76b118 Dimitris Aragiorgis
    snf-manage component-add "home" https://{0} home-icon.png
540 b91452fa Giorgos Korfiatis
    snf-manage component-add "cyclades" {1}ui/
541 b91452fa Giorgos Korfiatis
    snf-manage component-add "pithos" {2}ui/
542 b91452fa Giorgos Korfiatis
    snf-manage component-add "astakos" {3}ui/
543 b91452fa Giorgos Korfiatis
    """.format(env.env.cms.fqdn, cyclades_base_url,
544 c0c8263a Dimitris Aragiorgis
               pithos_base_url, astakos_base_url)
545 b91452fa Giorgos Korfiatis
    try_run(cmd)
546 b91452fa Giorgos Korfiatis
    import_service("astakos", astakos_base_url)
547 b91452fa Giorgos Korfiatis
    import_service("pithos", pithos_base_url)
548 b91452fa Giorgos Korfiatis
    import_service("cyclades", cyclades_base_url)
549 b91452fa Giorgos Korfiatis
    cmd = """
550 b91452fa Giorgos Korfiatis
    snf-manage resource-modify --limit 40G pithos.diskspace
551 b91452fa Giorgos Korfiatis
    snf-manage resource-modify --limit 2 astakos.pending_app
552 b91452fa Giorgos Korfiatis
    snf-manage resource-modify --limit 4 cyclades.vm
553 b91452fa Giorgos Korfiatis
    snf-manage resource-modify --limit 40G cyclades.disk
554 b91452fa Giorgos Korfiatis
    snf-manage resource-modify --limit 8G cyclades.ram
555 b91452fa Giorgos Korfiatis
    snf-manage resource-modify --limit 16 cyclades.cpu
556 b91452fa Giorgos Korfiatis
    snf-manage resource-modify --limit 4 cyclades.network.private
557 b91452fa Giorgos Korfiatis
    """
558 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
559 ad76b118 Dimitris Aragiorgis
560 ad76b118 Dimitris Aragiorgis
561 ad76b118 Dimitris Aragiorgis
@roles("accounts")
562 ad76b118 Dimitris Aragiorgis
def add_user():
563 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * adding user %s to astakos..." % env.env.user_email)
564 ad76b118 Dimitris Aragiorgis
    email=env.env.user_email
565 ad76b118 Dimitris Aragiorgis
    name=env.env.user_name
566 ad76b118 Dimitris Aragiorgis
    lastname=env.env.user_lastname
567 ad76b118 Dimitris Aragiorgis
    passwd=env.env.user_passwd
568 ad76b118 Dimitris Aragiorgis
    cmd = """
569 ad76b118 Dimitris Aragiorgis
    snf-manage user-add {0} {1} {2}
570 ad76b118 Dimitris Aragiorgis
    """.format(email, name, lastname)
571 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
572 9b69ce64 Dimitris Aragiorgis
    with settings(host_string=env.env.db.ip):
573 ad76b118 Dimitris Aragiorgis
        uid, user_auth_token, user_uuid = get_auth_token_from_db(email)
574 ad76b118 Dimitris Aragiorgis
    cmd = """
575 ad76b118 Dimitris Aragiorgis
    snf-manage user-modify --password {0} {1}
576 ad76b118 Dimitris Aragiorgis
    """.format(passwd, uid)
577 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
578 ad76b118 Dimitris Aragiorgis
579 ad76b118 Dimitris Aragiorgis
580 ad76b118 Dimitris Aragiorgis
@roles("accounts")
581 ad76b118 Dimitris Aragiorgis
def activate_user(user_email=None):
582 ad76b118 Dimitris Aragiorgis
    if not user_email:
583 ad76b118 Dimitris Aragiorgis
      user_email = env.env.user_email
584 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Activate user %s..." % user_email)
585 9b69ce64 Dimitris Aragiorgis
    with settings(host_string=env.env.db.ip):
586 ad76b118 Dimitris Aragiorgis
        uid, user_auth_token, user_uuid = get_auth_token_from_db(user_email)
587 ad76b118 Dimitris Aragiorgis
588 ad76b118 Dimitris Aragiorgis
    cmd = """
589 ad76b118 Dimitris Aragiorgis
    snf-manage user-modify --verify {0}
590 ad76b118 Dimitris Aragiorgis
    snf-manage user-modify --accept {0}
591 ad76b118 Dimitris Aragiorgis
    """.format(uid)
592 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
593 ad76b118 Dimitris Aragiorgis
594 ad76b118 Dimitris Aragiorgis
@roles("accounts")
595 ad76b118 Dimitris Aragiorgis
def setup_astakos():
596 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up snf-astakos-app...")
597 ad76b118 Dimitris Aragiorgis
    setup_gunicorn()
598 ad76b118 Dimitris Aragiorgis
    setup_apache()
599 ad76b118 Dimitris Aragiorgis
    setup_webproject()
600 ad76b118 Dimitris Aragiorgis
    install_package("python-django-south")
601 ad76b118 Dimitris Aragiorgis
    install_package("snf-astakos-app")
602 ad76b118 Dimitris Aragiorgis
    install_package("kamaki")
603 ad76b118 Dimitris Aragiorgis
604 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/astakos.conf"
605 ad76b118 Dimitris Aragiorgis
    replace = {
606 ad76b118 Dimitris Aragiorgis
      "ACCOUNTS": env.env.accounts.fqdn,
607 ad76b118 Dimitris Aragiorgis
      "domain": env.env.domain,
608 ad76b118 Dimitris Aragiorgis
      "CYCLADES": env.env.cyclades.fqdn,
609 ad76b118 Dimitris Aragiorgis
      "PITHOS": env.env.pithos.fqdn,
610 ad76b118 Dimitris Aragiorgis
    }
611 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
612 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
613 ad76b118 Dimitris Aragiorgis
    if env.csrf_disable:
614 ad76b118 Dimitris Aragiorgis
      cmd = """
615 ad76b118 Dimitris Aragiorgis
cat <<EOF >> /etc/synnefo/astakos.conf
616 ad76b118 Dimitris Aragiorgis
try:
617 ad76b118 Dimitris Aragiorgis
  MIDDLEWARE_CLASSES.remove('django.middleware.csrf.CsrfViewMiddleware')
618 ad76b118 Dimitris Aragiorgis
except:
619 ad76b118 Dimitris Aragiorgis
  pass
620 ad76b118 Dimitris Aragiorgis
EOF
621 ad76b118 Dimitris Aragiorgis
"""
622 ad76b118 Dimitris Aragiorgis
      try_run(cmd)
623 ad76b118 Dimitris Aragiorgis
624 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
625 ad76b118 Dimitris Aragiorgis
626 ad76b118 Dimitris Aragiorgis
    cmd = """
627 ad76b118 Dimitris Aragiorgis
    snf-manage syncdb --noinput
628 ad76b118 Dimitris Aragiorgis
    snf-manage migrate im --delete-ghost-migrations
629 ad76b118 Dimitris Aragiorgis
    snf-manage migrate quotaholder_app
630 ad76b118 Dimitris Aragiorgis
    """
631 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
632 ad76b118 Dimitris Aragiorgis
633 b91452fa Giorgos Korfiatis
634 b91452fa Giorgos Korfiatis
def import_service(service, base_url):
635 c0c8263a Dimitris Aragiorgis
    try_run("snf-service-export %s %s | snf-manage service-import --json -" %
636 b91452fa Giorgos Korfiatis
            (service, base_url))
637 b91452fa Giorgos Korfiatis
638 ad76b118 Dimitris Aragiorgis
639 ad76b118 Dimitris Aragiorgis
@roles("accounts")
640 ad76b118 Dimitris Aragiorgis
def get_service_details(service="pithos"):
641 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Getting registered details for %s service..." % service)
642 ad76b118 Dimitris Aragiorgis
    result = try_run("snf-manage component-list")
643 ad76b118 Dimitris Aragiorgis
    r = re.compile(r".*%s.*" % service, re.M)
644 ad76b118 Dimitris Aragiorgis
    service_id, _, _, service_token = r.search(result).group().split()
645 ad76b118 Dimitris Aragiorgis
    # print("%s: %s %s" % (service, service_id, service_token))
646 ad76b118 Dimitris Aragiorgis
    return (service_id, service_token)
647 ad76b118 Dimitris Aragiorgis
648 ad76b118 Dimitris Aragiorgis
649 ad76b118 Dimitris Aragiorgis
@roles("db")
650 ad76b118 Dimitris Aragiorgis
def get_auth_token_from_db(user_email=None):
651 ad76b118 Dimitris Aragiorgis
    if not user_email:
652 ad76b118 Dimitris Aragiorgis
        user_email=env.env.user_email
653 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Getting authentication token and uuid for user %s..." % user_email)
654 ad76b118 Dimitris Aragiorgis
    cmd = """
655 ad76b118 Dimitris Aragiorgis
    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
656 ad76b118 Dimitris Aragiorgis
    su - postgres -c  "psql -w -d snf_apps -f /tmp/psqlcmd"
657 ad76b118 Dimitris Aragiorgis
    """.format(user_email)
658 ad76b118 Dimitris Aragiorgis
659 ad76b118 Dimitris Aragiorgis
    result = try_run(cmd)
660 ad76b118 Dimitris Aragiorgis
    r = re.compile(r"(\d+)[ |]*(\S+)[ |]*(\S+)[ |]*" + user_email, re.M)
661 ad76b118 Dimitris Aragiorgis
    match = r.search(result)
662 ad76b118 Dimitris Aragiorgis
    uid, user_auth_token, user_uuid = match.groups()
663 ad76b118 Dimitris Aragiorgis
    # print("%s: %s %s %s" % ( user_email, uid, user_auth_token, user_uuid))
664 ad76b118 Dimitris Aragiorgis
665 ad76b118 Dimitris Aragiorgis
    return (uid, user_auth_token, user_uuid)
666 ad76b118 Dimitris Aragiorgis
667 ad76b118 Dimitris Aragiorgis
668 ad76b118 Dimitris Aragiorgis
@roles("cms")
669 ad76b118 Dimitris Aragiorgis
def cms_loaddata():
670 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Loading cms initial data...")
671 ad76b118 Dimitris Aragiorgis
    if env.cms_pass:
672 ad76b118 Dimitris Aragiorgis
      debug(env.host, "Aborting. Prerequisites not met.")
673 ad76b118 Dimitris Aragiorgis
      return
674 ad76b118 Dimitris Aragiorgis
    tmpl = "/tmp/sites.json"
675 ad76b118 Dimitris Aragiorgis
    replace = {}
676 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
677 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
678 ad76b118 Dimitris Aragiorgis
679 ad76b118 Dimitris Aragiorgis
    tmpl = "/tmp/page.json"
680 ad76b118 Dimitris Aragiorgis
    replace = {}
681 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
682 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
683 ad76b118 Dimitris Aragiorgis
684 ad76b118 Dimitris Aragiorgis
    cmd = """
685 ad76b118 Dimitris Aragiorgis
    snf-manage loaddata /tmp/sites.json
686 ad76b118 Dimitris Aragiorgis
    snf-manage loaddata /tmp/page.json
687 ad76b118 Dimitris Aragiorgis
    snf-manage createsuperuser --username=admin --email=admin@{0} --noinput
688 ad76b118 Dimitris Aragiorgis
    """.format(env.env.domain)
689 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
690 ad76b118 Dimitris Aragiorgis
691 ad76b118 Dimitris Aragiorgis
692 ad76b118 Dimitris Aragiorgis
@roles("cms")
693 ad76b118 Dimitris Aragiorgis
def setup_cms():
694 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up cms...")
695 ad76b118 Dimitris Aragiorgis
    if env.cms_pass:
696 ad76b118 Dimitris Aragiorgis
      debug(env.host, "Aborting. Prerequisites not met.")
697 ad76b118 Dimitris Aragiorgis
      return
698 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
699 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 accounts." + env.env.domain)
700 ad76b118 Dimitris Aragiorgis
    setup_gunicorn()
701 ad76b118 Dimitris Aragiorgis
    setup_apache()
702 ad76b118 Dimitris Aragiorgis
    setup_webproject()
703 ad76b118 Dimitris Aragiorgis
    install_package("snf-cloudcms")
704 ad76b118 Dimitris Aragiorgis
705 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/cms.conf"
706 ad76b118 Dimitris Aragiorgis
    replace = {
707 ad76b118 Dimitris Aragiorgis
        "ACCOUNTS": env.env.accounts.fqdn,
708 ad76b118 Dimitris Aragiorgis
        }
709 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
710 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
711 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
712 ad76b118 Dimitris Aragiorgis
713 ad76b118 Dimitris Aragiorgis
714 ad76b118 Dimitris Aragiorgis
    cmd = """
715 ad76b118 Dimitris Aragiorgis
    snf-manage syncdb
716 ad76b118 Dimitris Aragiorgis
    snf-manage migrate --delete-ghost-migrations
717 ad76b118 Dimitris Aragiorgis
    """.format(env.env.domain)
718 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
719 ad76b118 Dimitris Aragiorgis
720 ad76b118 Dimitris Aragiorgis
721 ad76b118 Dimitris Aragiorgis
def setup_nfs_dirs():
722 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Creating NFS mount point for pithos and ganeti...")
723 ad76b118 Dimitris Aragiorgis
    cmd = """
724 ad76b118 Dimitris Aragiorgis
    mkdir -p {0}
725 ad76b118 Dimitris Aragiorgis
    cd {0}
726 ad76b118 Dimitris Aragiorgis
    mkdir -p data
727 ad76b118 Dimitris Aragiorgis
    chown www-data:www-data data
728 ad76b118 Dimitris Aragiorgis
    chmod g+ws data
729 ad76b118 Dimitris Aragiorgis
    mkdir -p /srv/okeanos
730 ad76b118 Dimitris Aragiorgis
    """.format(env.env.pithos_dir)
731 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
732 ad76b118 Dimitris Aragiorgis
733 ad76b118 Dimitris Aragiorgis
734 ad76b118 Dimitris Aragiorgis
@roles("nodes")
735 ad76b118 Dimitris Aragiorgis
def setup_nfs_clients():
736 9b69ce64 Dimitris Aragiorgis
    if env.host == env.env.pithos.ip:
737 ad76b118 Dimitris Aragiorgis
      return
738 ad76b118 Dimitris Aragiorgis
739 4baa4696 Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
740 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Mounting pithos NFS mount point...")
741 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
742 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.pithos.hostname)
743 4baa4696 Dimitris Aragiorgis
    with settings(host_string=env.env.pithos.ip):
744 4baa4696 Dimitris Aragiorgis
        update_nfs_exports(host_info.ip)
745 4baa4696 Dimitris Aragiorgis
746 ad76b118 Dimitris Aragiorgis
    install_package("nfs-common")
747 4baa4696 Dimitris Aragiorgis
    for d in [env.env.pithos_dir, env.env.image_dir]:
748 ad76b118 Dimitris Aragiorgis
      try_run("mkdir -p " + d)
749 ad76b118 Dimitris Aragiorgis
      cmd = """
750 4baa4696 Dimitris Aragiorgis
      echo "{0}:{1} {1}  nfs defaults,rw,noatime,rsize=131072,wsize=131072,timeo=14,intr,noacl" >> /etc/fstab
751 4baa4696 Dimitris Aragiorgis
      """.format(env.env.pithos.ip, d)
752 ad76b118 Dimitris Aragiorgis
      try_run(cmd)
753 ad76b118 Dimitris Aragiorgis
      try_run("mount " + d)
754 ad76b118 Dimitris Aragiorgis
755 ad76b118 Dimitris Aragiorgis
@roles("pithos")
756 4baa4696 Dimitris Aragiorgis
def update_nfs_exports(ip):
757 4baa4696 Dimitris Aragiorgis
    tmpl = "/tmp/exports"
758 ad76b118 Dimitris Aragiorgis
    replace = {
759 ad76b118 Dimitris Aragiorgis
      "pithos_dir": env.env.pithos_dir,
760 4baa4696 Dimitris Aragiorgis
      "image_dir": env.env.image_dir,
761 4baa4696 Dimitris Aragiorgis
      "ip": ip,
762 ad76b118 Dimitris Aragiorgis
      }
763 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
764 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
765 4baa4696 Dimitris Aragiorgis
    try_run("cat %s >> /etc/exports" % tmpl)
766 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/nfs-kernel-server restart")
767 ad76b118 Dimitris Aragiorgis
768 4baa4696 Dimitris Aragiorgis
@roles("pithos")
769 4baa4696 Dimitris Aragiorgis
def setup_nfs_server():
770 4baa4696 Dimitris Aragiorgis
    debug(env.host, " * Setting up NFS server for pithos...")
771 4baa4696 Dimitris Aragiorgis
    setup_nfs_dirs()
772 4baa4696 Dimitris Aragiorgis
    install_package("nfs-kernel-server")
773 4baa4696 Dimitris Aragiorgis
774 ad76b118 Dimitris Aragiorgis
775 ad76b118 Dimitris Aragiorgis
@roles("pithos")
776 ad76b118 Dimitris Aragiorgis
def setup_pithos():
777 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up snf-pithos-app...")
778 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
779 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 accounts." + env.env.domain)
780 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.db.ip)
781 ad76b118 Dimitris Aragiorgis
    setup_gunicorn()
782 ad76b118 Dimitris Aragiorgis
    setup_apache()
783 ad76b118 Dimitris Aragiorgis
    setup_webproject()
784 ad76b118 Dimitris Aragiorgis
785 9b69ce64 Dimitris Aragiorgis
    with settings(host_string=env.env.accounts.ip):
786 ad76b118 Dimitris Aragiorgis
        service_id, service_token = get_service_details("pithos")
787 ad76b118 Dimitris Aragiorgis
788 ad76b118 Dimitris Aragiorgis
    install_package("kamaki")
789 ad76b118 Dimitris Aragiorgis
    install_package("snf-pithos-backend")
790 ad76b118 Dimitris Aragiorgis
    install_package("snf-pithos-app")
791 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/pithos.conf"
792 ad76b118 Dimitris Aragiorgis
    replace = {
793 ad76b118 Dimitris Aragiorgis
        "ACCOUNTS": env.env.accounts.fqdn,
794 ad76b118 Dimitris Aragiorgis
        "PITHOS": env.env.pithos.fqdn,
795 ad76b118 Dimitris Aragiorgis
        "db_node": env.env.db.ip,
796 ad76b118 Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
797 ad76b118 Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
798 ad76b118 Dimitris Aragiorgis
        "pithos_dir": env.env.pithos_dir,
799 ad76b118 Dimitris Aragiorgis
        "PITHOS_SERVICE_TOKEN": service_token,
800 ad76b118 Dimitris Aragiorgis
        "proxy": env.env.pithos.hostname == env.env.accounts.hostname
801 ad76b118 Dimitris Aragiorgis
        }
802 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
803 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
804 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
805 ad76b118 Dimitris Aragiorgis
806 ad76b118 Dimitris Aragiorgis
    install_package("snf-pithos-webclient")
807 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/webclient.conf"
808 ad76b118 Dimitris Aragiorgis
    replace = {
809 ad76b118 Dimitris Aragiorgis
        "ACCOUNTS": env.env.accounts.fqdn,
810 ad76b118 Dimitris Aragiorgis
        "PITHOS_UI_CLOUDBAR_ACTIVE_SERVICE": service_id,
811 ad76b118 Dimitris Aragiorgis
        }
812 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
813 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
814 ad76b118 Dimitris Aragiorgis
815 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
816 ad76b118 Dimitris Aragiorgis
    #TOFIX: the previous command lets pithos-backend create blocks and maps
817 ad76b118 Dimitris Aragiorgis
    #       with root owner
818 ad76b118 Dimitris Aragiorgis
    try_run("chown -R www-data:www-data %s/data " % env.env.pithos_dir)
819 ad76b118 Dimitris Aragiorgis
    #try_run("pithos-migrate stamp 4c8ccdc58192")
820 ad76b118 Dimitris Aragiorgis
    #try_run("pithos-migrate upgrade head")
821 ad76b118 Dimitris Aragiorgis
822 ad76b118 Dimitris Aragiorgis
823 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
824 ad76b118 Dimitris Aragiorgis
def setup_ganeti():
825 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up snf-ganeti...")
826 ad76b118 Dimitris Aragiorgis
    node_info = env.env.ips_info[env.host]
827 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
828 ad76b118 Dimitris Aragiorgis
        #if env.enable_lvm:
829 ad76b118 Dimitris Aragiorgis
        #    try_run("vgs " + env.env.vg)
830 ad76b118 Dimitris Aragiorgis
        try_run("getent hosts " + env.env.cluster.fqdn)
831 ad76b118 Dimitris Aragiorgis
        try_run("getent hosts %s | grep -v ^127" % env.host)
832 ad76b118 Dimitris Aragiorgis
        try_run("hostname -f | grep " + node_info.fqdn)
833 ad76b118 Dimitris Aragiorgis
        #try_run("ip link show " + env.env.common_bridge)
834 ad76b118 Dimitris Aragiorgis
        #try_run("ip link show " + env.env.common_bridge)
835 ad76b118 Dimitris Aragiorgis
        #try_run("apt-get update")
836 ad76b118 Dimitris Aragiorgis
    install_package("qemu-kvm")
837 ad76b118 Dimitris Aragiorgis
    install_package("python-bitarray")
838 ad76b118 Dimitris Aragiorgis
    install_package("ganeti-htools")
839 ad76b118 Dimitris Aragiorgis
    install_package("snf-ganeti")
840 ad76b118 Dimitris Aragiorgis
    try_run("mkdir -p /srv/ganeti/file-storage/")
841 ad76b118 Dimitris Aragiorgis
    cmd = """
842 ad76b118 Dimitris Aragiorgis
cat <<EOF > /etc/ganeti/file-storage-paths
843 ad76b118 Dimitris Aragiorgis
/srv/ganeti/file-storage
844 ad76b118 Dimitris Aragiorgis
/srv/ganeti/shared-file-storage
845 ad76b118 Dimitris Aragiorgis
EOF
846 ad76b118 Dimitris Aragiorgis
"""
847 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
848 ad76b118 Dimitris Aragiorgis
849 ad76b118 Dimitris Aragiorgis
850 ad76b118 Dimitris Aragiorgis
@roles("master")
851 ad76b118 Dimitris Aragiorgis
def add_rapi_user():
852 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Adding RAPI user to Ganeti backend...")
853 ad76b118 Dimitris Aragiorgis
    cmd = """
854 ad76b118 Dimitris Aragiorgis
    echo -n "{0}:Ganeti Remote API:{1}" | openssl md5
855 ad76b118 Dimitris Aragiorgis
    """.format(env.env.synnefo_user, env.env.synnefo_rapi_passwd)
856 ad76b118 Dimitris Aragiorgis
    result = try_run(cmd)
857 ad76b118 Dimitris Aragiorgis
    cmd = """
858 ad76b118 Dimitris Aragiorgis
    echo "{0} {1}{2} write" >> /var/lib/ganeti/rapi/users
859 ad76b118 Dimitris Aragiorgis
    """.format(env.env.synnefo_user, '{ha1}',result)
860 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
861 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/ganeti restart")
862 ad76b118 Dimitris Aragiorgis
863 ad76b118 Dimitris Aragiorgis
@roles("master")
864 ad76b118 Dimitris Aragiorgis
def add_nodes():
865 ad76b118 Dimitris Aragiorgis
    nodes = env.env.cluster_nodes.split(",")
866 ad76b118 Dimitris Aragiorgis
    nodes.remove(env.env.master_node)
867 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Adding nodes to Ganeti backend...")
868 ad76b118 Dimitris Aragiorgis
    for n in nodes:
869 ad76b118 Dimitris Aragiorgis
        add_node(n)
870 ad76b118 Dimitris Aragiorgis
871 ad76b118 Dimitris Aragiorgis
@roles("master")
872 ad76b118 Dimitris Aragiorgis
def add_node(node):
873 ad76b118 Dimitris Aragiorgis
    node_info = env.env.nodes_info[node]
874 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Adding node %s to Ganeti backend..." % node_info.fqdn)
875 ad76b118 Dimitris Aragiorgis
    cmd = "gnt-node add --no-ssh-key-check --master-capable=yes --vm-capable=yes " + node_info.fqdn
876 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
877 ad76b118 Dimitris Aragiorgis
878 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
879 ad76b118 Dimitris Aragiorgis
def enable_drbd():
880 ad76b118 Dimitris Aragiorgis
    if env.enable_drbd:
881 ad76b118 Dimitris Aragiorgis
        debug(env.host, " * Enabling DRBD...")
882 ad76b118 Dimitris Aragiorgis
        try_run("modprobe drbd minor_count=255 usermode_helper=/bin/true")
883 ad76b118 Dimitris Aragiorgis
        try_run("echo drbd minor_count=255 usermode_helper=/bin/true >> /etc/modules")
884 ad76b118 Dimitris Aragiorgis
885 ad76b118 Dimitris Aragiorgis
@roles("master")
886 ad76b118 Dimitris Aragiorgis
def setup_drbd_dparams():
887 ad76b118 Dimitris Aragiorgis
    if env.enable_drbd:
888 ad76b118 Dimitris Aragiorgis
        debug(env.host, " * Twicking drbd related disk parameters in Ganeti...")
889 ad76b118 Dimitris Aragiorgis
        cmd = """
890 ad76b118 Dimitris Aragiorgis
        gnt-cluster modify --disk-parameters=drbd:metavg={0}
891 ad76b118 Dimitris Aragiorgis
        gnt-group modify --disk-parameters=drbd:metavg={0} default
892 ad76b118 Dimitris Aragiorgis
        """.format(env.env.vg)
893 ad76b118 Dimitris Aragiorgis
        try_run(cmd)
894 ad76b118 Dimitris Aragiorgis
895 ad76b118 Dimitris Aragiorgis
@roles("master")
896 ad76b118 Dimitris Aragiorgis
def enable_lvm():
897 ad76b118 Dimitris Aragiorgis
    if env.enable_lvm:
898 ad76b118 Dimitris Aragiorgis
        debug(env.host, " * Enabling LVM...")
899 ad76b118 Dimitris Aragiorgis
        cmd = """
900 ad76b118 Dimitris Aragiorgis
        gnt-cluster modify --vg-name={0}
901 ad76b118 Dimitris Aragiorgis
        """.format(env.env.vg)
902 ad76b118 Dimitris Aragiorgis
        try_run(cmd)
903 ad76b118 Dimitris Aragiorgis
    else:
904 ad76b118 Dimitris Aragiorgis
        debug(env.host, " * Disabling LVM...")
905 ad76b118 Dimitris Aragiorgis
        try_run("gnt-cluster modify --no-lvm-storage")
906 ad76b118 Dimitris Aragiorgis
907 ad76b118 Dimitris Aragiorgis
@roles("master")
908 ad76b118 Dimitris Aragiorgis
def destroy_cluster():
909 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Destroying Ganeti cluster...")
910 ad76b118 Dimitris Aragiorgis
    #TODO: remove instances first
911 ad76b118 Dimitris Aragiorgis
    allnodes = env.env.cluster_hostnames[:]
912 ad76b118 Dimitris Aragiorgis
    allnodes.remove(env.host)
913 ad76b118 Dimitris Aragiorgis
    for n in allnodes:
914 ad76b118 Dimitris Aragiorgis
      host_info = env.env.ips_info[host]
915 ad76b118 Dimitris Aragiorgis
      debug(env.host, " * Removing node %s..." % n)
916 ad76b118 Dimitris Aragiorgis
      cmd = "gnt-node remove  " + host_info.fqdn
917 ad76b118 Dimitris Aragiorgis
      try_run(cmd)
918 ad76b118 Dimitris Aragiorgis
    try_run("gnt-cluster destroy --yes-do-it")
919 ad76b118 Dimitris Aragiorgis
920 ad76b118 Dimitris Aragiorgis
921 ad76b118 Dimitris Aragiorgis
@roles("master")
922 ad76b118 Dimitris Aragiorgis
def init_cluster():
923 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Initializing Ganeti backend...")
924 ad76b118 Dimitris Aragiorgis
    # extra = ""
925 ad76b118 Dimitris Aragiorgis
    # if env.enable_lvm:
926 ad76b118 Dimitris Aragiorgis
    #     extra += " --vg-name={0} ".format(env.env.vg)
927 ad76b118 Dimitris Aragiorgis
    # else:
928 ad76b118 Dimitris Aragiorgis
    #     extra += " --no-lvm-storage "
929 ad76b118 Dimitris Aragiorgis
    # if not env.enable_drbd:
930 ad76b118 Dimitris Aragiorgis
    #     extra += " --no-drbd-storage "
931 ad76b118 Dimitris Aragiorgis
    extra = " --no-lvm-storage --no-drbd-storage "
932 ad76b118 Dimitris Aragiorgis
    cmd = """
933 ad76b118 Dimitris Aragiorgis
    gnt-cluster init --enabled-hypervisors=kvm \
934 ad76b118 Dimitris Aragiorgis
                     {0} \
935 ad76b118 Dimitris Aragiorgis
                     --nic-parameters link={1},mode=bridged \
936 ad76b118 Dimitris Aragiorgis
                     --master-netdev {2} \
937 ad76b118 Dimitris Aragiorgis
                     --default-iallocator hail \
938 ad76b118 Dimitris Aragiorgis
                     --hypervisor-parameters kvm:kernel_path=,vnc_bind_address=0.0.0.0 \
939 ad76b118 Dimitris Aragiorgis
                     --no-ssh-init --no-etc-hosts \
940 ad76b118 Dimitris Aragiorgis
                    {3}
941 ad76b118 Dimitris Aragiorgis

942 ad76b118 Dimitris Aragiorgis
    """.format(extra, env.env.common_bridge,
943 ad76b118 Dimitris Aragiorgis
               env.env.cluster_netdev, env.env.cluster.fqdn)
944 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
945 ad76b118 Dimitris Aragiorgis
946 ad76b118 Dimitris Aragiorgis
947 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
948 ad76b118 Dimitris Aragiorgis
def debootstrap():
949 ad76b118 Dimitris Aragiorgis
    install_package("ganeti-instance-debootstrap")
950 ad76b118 Dimitris Aragiorgis
951 ad76b118 Dimitris Aragiorgis
952 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
953 ad76b118 Dimitris Aragiorgis
def setup_image_host():
954 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up snf-image...")
955 ad76b118 Dimitris Aragiorgis
    install_package("snf-pithos-backend")
956 ad76b118 Dimitris Aragiorgis
    install_package("snf-image")
957 4baa4696 Dimitris Aragiorgis
    try_run("mkdir -p %s" % env.env.image_dir)
958 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/default/snf-image"
959 ad76b118 Dimitris Aragiorgis
    replace = {
960 ad76b118 Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
961 ad76b118 Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
962 ad76b118 Dimitris Aragiorgis
        "pithos_dir": env.env.pithos_dir,
963 ad76b118 Dimitris Aragiorgis
        "db_node": env.env.db.ip,
964 ad76b118 Dimitris Aragiorgis
    }
965 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
966 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
967 ad76b118 Dimitris Aragiorgis
968 ad76b118 Dimitris Aragiorgis
969 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
970 ad76b118 Dimitris Aragiorgis
def setup_image_helper():
971 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Updating helper image...")
972 ad76b118 Dimitris Aragiorgis
    cmd = """
973 ad76b118 Dimitris Aragiorgis
    snf-image-update-helper -y
974 ad76b118 Dimitris Aragiorgis
    """
975 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
976 ad76b118 Dimitris Aragiorgis
977 ad76b118 Dimitris Aragiorgis
978 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
979 ad76b118 Dimitris Aragiorgis
def setup_gtools():
980 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up snf-cyclades-gtools...")
981 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
982 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.mq.ip)
983 ad76b118 Dimitris Aragiorgis
    setup_common()
984 ad76b118 Dimitris Aragiorgis
    install_package("snf-cyclades-gtools")
985 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/gtools.conf"
986 ad76b118 Dimitris Aragiorgis
    replace = {
987 ad76b118 Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
988 ad76b118 Dimitris Aragiorgis
        "synnefo_rabbitmq_passwd": env.env.synnefo_rabbitmq_passwd,
989 ad76b118 Dimitris Aragiorgis
        "mq_node": env.env.mq.ip,
990 ad76b118 Dimitris Aragiorgis
    }
991 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
992 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
993 ad76b118 Dimitris Aragiorgis
994 ad76b118 Dimitris Aragiorgis
    cmd = """
995 ad76b118 Dimitris Aragiorgis
    sed -i 's/false/true/' /etc/default/snf-ganeti-eventd
996 ad76b118 Dimitris Aragiorgis
    /etc/init.d/snf-ganeti-eventd start
997 ad76b118 Dimitris Aragiorgis
    """
998 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
999 ad76b118 Dimitris Aragiorgis
1000 ad76b118 Dimitris Aragiorgis
1001 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
1002 ad76b118 Dimitris Aragiorgis
def setup_iptables():
1003 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up iptables to mangle DHCP requests...")
1004 ad76b118 Dimitris Aragiorgis
    cmd = """
1005 ad76b118 Dimitris Aragiorgis
    iptables -t mangle -A PREROUTING -i br+ -p udp -m udp --dport 67 -j NFQUEUE --queue-num 42
1006 ad76b118 Dimitris Aragiorgis
    iptables -t mangle -A PREROUTING -i tap+ -p udp -m udp --dport 67 -j NFQUEUE --queue-num 42
1007 ad76b118 Dimitris Aragiorgis
    iptables -t mangle -A PREROUTING -i prv+ -p udp -m udp --dport 67 -j NFQUEUE --queue-num 42
1008 ad76b118 Dimitris Aragiorgis

1009 ad76b118 Dimitris Aragiorgis
    ip6tables -t mangle -A PREROUTING -i br+ -p ipv6-icmp -m icmp6 --icmpv6-type 133 -j NFQUEUE --queue-num 43
1010 ad76b118 Dimitris Aragiorgis
    ip6tables -t mangle -A PREROUTING -i br+ -p ipv6-icmp -m icmp6 --icmpv6-type 135 -j NFQUEUE --queue-num 44
1011 ad76b118 Dimitris Aragiorgis
    """
1012 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1013 ad76b118 Dimitris Aragiorgis
1014 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
1015 ad76b118 Dimitris Aragiorgis
def setup_network():
1016 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up networking for Ganeti instances (nfdhcpd, etc.)...")
1017 ad76b118 Dimitris Aragiorgis
    install_package("nfqueue-bindings-python")
1018 ad76b118 Dimitris Aragiorgis
    install_package("nfdhcpd")
1019 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/nfdhcpd/nfdhcpd.conf"
1020 ad76b118 Dimitris Aragiorgis
    replace = {
1021 ad76b118 Dimitris Aragiorgis
      "ns_node_ip": env.env.ns.ip
1022 ad76b118 Dimitris Aragiorgis
      }
1023 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
1024 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
1025 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/nfdhcpd restart")
1026 ad76b118 Dimitris Aragiorgis
1027 ad76b118 Dimitris Aragiorgis
    install_package("snf-network")
1028 ad76b118 Dimitris Aragiorgis
    cmd = """
1029 ad76b118 Dimitris Aragiorgis
    sed -i 's/MAC_MASK.*/MAC_MASK = ff:ff:f0:00:00:00/' /etc/default/snf-network
1030 ad76b118 Dimitris Aragiorgis
    """
1031 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1032 ad76b118 Dimitris Aragiorgis
1033 ad76b118 Dimitris Aragiorgis
1034 ad76b118 Dimitris Aragiorgis
@roles("router")
1035 ad76b118 Dimitris Aragiorgis
def setup_router():
1036 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up internal router for NAT...")
1037 ad76b118 Dimitris Aragiorgis
    cmd = """
1038 ad76b118 Dimitris Aragiorgis
    echo 1 > /proc/sys/net/ipv4/ip_forward
1039 ad76b118 Dimitris Aragiorgis
    iptables -t nat -A POSTROUTING -s {0} -o {3} -j MASQUERADE
1040 ad76b118 Dimitris Aragiorgis
    ip addr add {1} dev {2}
1041 ad76b118 Dimitris Aragiorgis
    ip route add {0} dev {2} src {1}
1042 ad76b118 Dimitris Aragiorgis
    """.format(env.env.synnefo_public_network_subnet,
1043 ad76b118 Dimitris Aragiorgis
               env.env.synnefo_public_network_gateway,
1044 ad76b118 Dimitris Aragiorgis
               env.env.common_bridge, env.env.public_iface)
1045 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1046 ad76b118 Dimitris Aragiorgis
1047 1f471540 Dionysis Grigoropoulos
1048 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1049 ad76b118 Dimitris Aragiorgis
def cyclades_loaddata():
1050 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Loading initial data for cyclades...")
1051 1f471540 Dionysis Grigoropoulos
    try_run("snf-manage flavor-create %s %s %s %s" % (env.env.flavor_cpu,
1052 1f471540 Dionysis Grigoropoulos
                                                      env.env.flavor_ram,
1053 1f471540 Dionysis Grigoropoulos
                                                      env.env.flavor_disk,
1054 1f471540 Dionysis Grigoropoulos
                                                      env.env.flavor_storage))
1055 ad76b118 Dimitris Aragiorgis
    #run("snf-manage loaddata flavors")
1056 ad76b118 Dimitris Aragiorgis
1057 ad76b118 Dimitris Aragiorgis
1058 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1059 ad76b118 Dimitris Aragiorgis
def setup_cyclades():
1060 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up snf-cyclades-app...")
1061 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
1062 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 accounts." + env.env.domain)
1063 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.db.ip)
1064 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.mq.ip)
1065 ad76b118 Dimitris Aragiorgis
    setup_gunicorn()
1066 ad76b118 Dimitris Aragiorgis
    setup_apache()
1067 ad76b118 Dimitris Aragiorgis
    setup_webproject()
1068 ad76b118 Dimitris Aragiorgis
    install_package("memcached")
1069 ad76b118 Dimitris Aragiorgis
    install_package("python-memcache")
1070 ad76b118 Dimitris Aragiorgis
    install_package("snf-pithos-backend")
1071 ad76b118 Dimitris Aragiorgis
    install_package("kamaki")
1072 ad76b118 Dimitris Aragiorgis
    install_package("snf-cyclades-app")
1073 ad76b118 Dimitris Aragiorgis
    install_package("python-django-south")
1074 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/cyclades.conf"
1075 ad76b118 Dimitris Aragiorgis
1076 9b69ce64 Dimitris Aragiorgis
    with settings(host_string=env.env.accounts.ip):
1077 ad76b118 Dimitris Aragiorgis
        service_id, service_token = get_service_details("cyclades")
1078 ad76b118 Dimitris Aragiorgis
1079 ad76b118 Dimitris Aragiorgis
    replace = {
1080 ad76b118 Dimitris Aragiorgis
        "ACCOUNTS": env.env.accounts.fqdn,
1081 ad76b118 Dimitris Aragiorgis
        "CYCLADES": env.env.cyclades.fqdn,
1082 ad76b118 Dimitris Aragiorgis
        "mq_node": env.env.mq.ip,
1083 ad76b118 Dimitris Aragiorgis
        "db_node": env.env.db.ip,
1084 ad76b118 Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
1085 ad76b118 Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
1086 ad76b118 Dimitris Aragiorgis
        "synnefo_rabbitmq_passwd": env.env.synnefo_rabbitmq_passwd,
1087 ad76b118 Dimitris Aragiorgis
        "pithos_dir": env.env.pithos_dir,
1088 ad76b118 Dimitris Aragiorgis
        "common_bridge": env.env.common_bridge,
1089 ad76b118 Dimitris Aragiorgis
        "HOST": env.env.cyclades.ip,
1090 ad76b118 Dimitris Aragiorgis
        "domain": env.env.domain,
1091 ad76b118 Dimitris Aragiorgis
        "CYCLADES_SERVICE_TOKEN": service_token,
1092 ad76b118 Dimitris Aragiorgis
        "proxy": env.env.cyclades.hostname == env.env.accounts.hostname
1093 ad76b118 Dimitris Aragiorgis
        }
1094 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
1095 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
1096 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
1097 ad76b118 Dimitris Aragiorgis
1098 ad76b118 Dimitris Aragiorgis
    cmd = """
1099 ad76b118 Dimitris Aragiorgis
    sed -i 's/false/true/' /etc/default/snf-dispatcher
1100 ad76b118 Dimitris Aragiorgis
    /etc/init.d/snf-dispatcher start
1101 ad76b118 Dimitris Aragiorgis
    """
1102 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1103 ad76b118 Dimitris Aragiorgis
1104 ad76b118 Dimitris Aragiorgis
    try_run("snf-manage syncdb")
1105 ad76b118 Dimitris Aragiorgis
    try_run("snf-manage migrate --delete-ghost-migrations")
1106 ad76b118 Dimitris Aragiorgis
1107 ad76b118 Dimitris Aragiorgis
1108 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1109 ad76b118 Dimitris Aragiorgis
def get_backend_id(cluster_name="ganeti1.synnefo.deploy.local"):
1110 ad76b118 Dimitris Aragiorgis
    backend_id = try_run("snf-manage backend-list 2>/dev/null | grep %s | awk '{print $1}'" % cluster_name)
1111 ad76b118 Dimitris Aragiorgis
    return backend_id
1112 ad76b118 Dimitris Aragiorgis
1113 ad76b118 Dimitris Aragiorgis
1114 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1115 ad76b118 Dimitris Aragiorgis
def add_backend():
1116 ad76b118 Dimitris Aragiorgis
    debug(env.host, "adding %s ganeti backend to cyclades..." % env.env.cluster.fqdn)
1117 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
1118 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.cluster.fqdn)
1119 ad76b118 Dimitris Aragiorgis
    cmd = """
1120 ad76b118 Dimitris Aragiorgis
    snf-manage backend-add --clustername={0} --user={1} --pass={2}
1121 ad76b118 Dimitris Aragiorgis
    """.format(env.env.cluster.fqdn, env.env.synnefo_user,
1122 ad76b118 Dimitris Aragiorgis
               env.env.synnefo_rapi_passwd)
1123 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1124 ad76b118 Dimitris Aragiorgis
    backend_id = get_backend_id(env.env.cluster.fqdn)
1125 ad76b118 Dimitris Aragiorgis
    try_run("snf-manage backend-modify --drained=False " + backend_id)
1126 ad76b118 Dimitris Aragiorgis
1127 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1128 ad76b118 Dimitris Aragiorgis
def pin_user_to_backend(user_email):
1129 ad76b118 Dimitris Aragiorgis
    backend_id = get_backend_id(env.env.cluster.fqdn)
1130 ad76b118 Dimitris Aragiorgis
    # pin user to backend
1131 ad76b118 Dimitris Aragiorgis
    cmd = """
1132 ad76b118 Dimitris Aragiorgis
cat <<EOF >> /etc/synnefo/cyclades.conf
1133 ad76b118 Dimitris Aragiorgis

1134 ad76b118 Dimitris Aragiorgis
BACKEND_PER_USER = {
1135 ad76b118 Dimitris Aragiorgis
  '%s': %s,
1136 ad76b118 Dimitris Aragiorgis
}
1137 ad76b118 Dimitris Aragiorgis

1138 ad76b118 Dimitris Aragiorgis
EOF
1139 ad76b118 Dimitris Aragiorgis
/etc/init.d/gunicorn restart
1140 ad76b118 Dimitris Aragiorgis
    """  % (user_email, backend_id)
1141 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1142 ad76b118 Dimitris Aragiorgis
1143 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1144 ad76b118 Dimitris Aragiorgis
def add_pools():
1145 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Creating pools of resources (brigdes, mac prefixes) in cyclades...")
1146 ad76b118 Dimitris Aragiorgis
    try_run("snf-manage pool-create --type=mac-prefix --base=aa:00:0 --size=65536")
1147 ad76b118 Dimitris Aragiorgis
    try_run("snf-manage pool-create --type=bridge --base=prv --size=20")
1148 ad76b118 Dimitris Aragiorgis
1149 ad76b118 Dimitris Aragiorgis
1150 b29b8213 Christos Stavrakakis
@roles("accounts", "cyclades", "pithos")
1151 b29b8213 Christos Stavrakakis
def export_services():
1152 b29b8213 Christos Stavrakakis
    debug(env.host, " * Exporting services...")
1153 b29b8213 Christos Stavrakakis
    host = env.host
1154 b29b8213 Christos Stavrakakis
    services = []
1155 b29b8213 Christos Stavrakakis
    if host == env.env.cyclades.ip:
1156 b29b8213 Christos Stavrakakis
        services.append("cyclades")
1157 b29b8213 Christos Stavrakakis
    if host == env.env.pithos.ip:
1158 b29b8213 Christos Stavrakakis
        services.append("pithos")
1159 b29b8213 Christos Stavrakakis
    if host == env.env.accounts.ip:
1160 b29b8213 Christos Stavrakakis
        services.append("astakos")
1161 b29b8213 Christos Stavrakakis
    for service in services:
1162 b29b8213 Christos Stavrakakis
        filename = "%s_services.json" % service
1163 b29b8213 Christos Stavrakakis
        cmd = "snf-manage service-export-%s > %s" % (service, filename)
1164 b29b8213 Christos Stavrakakis
        run(cmd)
1165 b29b8213 Christos Stavrakakis
        get(filename, filename+".local")
1166 b29b8213 Christos Stavrakakis
1167 b29b8213 Christos Stavrakakis
1168 b29b8213 Christos Stavrakakis
@roles("accounts")
1169 b29b8213 Christos Stavrakakis
def import_services():
1170 b29b8213 Christos Stavrakakis
    debug(env.host, " * Registering services to astakos...")
1171 b29b8213 Christos Stavrakakis
    for service in ["cyclades", "pithos", "astakos"]:
1172 b29b8213 Christos Stavrakakis
        filename = "%s_services.json" % service
1173 b29b8213 Christos Stavrakakis
        put(filename +".local", filename)
1174 b29b8213 Christos Stavrakakis
        cmd = "snf-manage service-import --json=%s" % filename
1175 b29b8213 Christos Stavrakakis
        run(cmd)
1176 b29b8213 Christos Stavrakakis
1177 b29b8213 Christos Stavrakakis
    debug(env.host, " * Setting default quota...")
1178 b29b8213 Christos Stavrakakis
    cmd = """
1179 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 40G pithos.diskspace
1180 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 2 astakos.pending_app
1181 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 4 cyclades.vm
1182 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 40G cyclades.disk
1183 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 16G cyclades.ram
1184 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 8G cyclades.active_ram
1185 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 32 cyclades.cpu
1186 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 16 cyclades.active_cpu
1187 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 4 cyclades.network.private
1188 b29b8213 Christos Stavrakakis
    """
1189 b29b8213 Christos Stavrakakis
    try_run(cmd)
1190 b29b8213 Christos Stavrakakis
1191 b29b8213 Christos Stavrakakis
1192 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1193 ad76b118 Dimitris Aragiorgis
def add_network():
1194 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Adding public network in cyclades...")
1195 ad76b118 Dimitris Aragiorgis
    backend_id = get_backend_id(env.env.cluster.fqdn)
1196 ad76b118 Dimitris Aragiorgis
    cmd = """
1197 e66eb6d6 Dimitris Aragiorgis
    snf-manage network-create --subnet={0} --gateway={1} --public --dhcp --flavor={2} --mode=bridged --link={3} --name=Internet --backend-id={4}
1198 ad76b118 Dimitris Aragiorgis
    """.format(env.env.synnefo_public_network_subnet,
1199 ad76b118 Dimitris Aragiorgis
               env.env.synnefo_public_network_gateway,
1200 ad76b118 Dimitris Aragiorgis
               env.env.synnefo_public_network_type,
1201 ad76b118 Dimitris Aragiorgis
               env.env.common_bridge, backend_id)
1202 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1203 ad76b118 Dimitris Aragiorgis
1204 ad76b118 Dimitris Aragiorgis
1205 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1206 ad76b118 Dimitris Aragiorgis
def setup_vncauthproxy():
1207 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up vncauthproxy...")
1208 ad76b118 Dimitris Aragiorgis
    install_package("snf-vncauthproxy")
1209 ad76b118 Dimitris Aragiorgis
    cmd = """
1210 ad76b118 Dimitris Aragiorgis
    echo CHUID="www-data:nogroup" >> /etc/default/vncauthproxy
1211 ad76b118 Dimitris Aragiorgis
    rm /var/log/vncauthproxy/vncauthproxy.log
1212 ad76b118 Dimitris Aragiorgis
    """
1213 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1214 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/vncauthproxy restart")
1215 ad76b118 Dimitris Aragiorgis
1216 ad76b118 Dimitris Aragiorgis
@roles("client")
1217 ad76b118 Dimitris Aragiorgis
def setup_kamaki():
1218 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up kamaki client...")
1219 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
1220 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 accounts." + env.env.domain)
1221 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 cyclades." + env.env.domain)
1222 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 pithos." + env.env.domain)
1223 ad76b118 Dimitris Aragiorgis
1224 9b69ce64 Dimitris Aragiorgis
    with settings(host_string=env.env.db.ip):
1225 ad76b118 Dimitris Aragiorgis
        uid, user_auth_token, user_uuid = get_auth_token_from_db(env.env.user_email)
1226 ad76b118 Dimitris Aragiorgis
1227 ad76b118 Dimitris Aragiorgis
    install_package("python-progress")
1228 ad76b118 Dimitris Aragiorgis
    install_package("kamaki")
1229 ad76b118 Dimitris Aragiorgis
    cmd = """
1230 ad76b118 Dimitris Aragiorgis
    kamaki config set cloud.default.url "https://{0}/astakos/identity/v2.0/"
1231 ad76b118 Dimitris Aragiorgis
    kamaki config set cloud.default.token {1}
1232 ad76b118 Dimitris Aragiorgis
    """.format(env.env.accounts.fqdn, user_auth_token)
1233 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1234 ad76b118 Dimitris Aragiorgis
    try_run("kamaki file create images")
1235 ad76b118 Dimitris Aragiorgis
1236 ad76b118 Dimitris Aragiorgis
@roles("client")
1237 ad76b118 Dimitris Aragiorgis
def upload_image(image="debian_base.diskdump"):
1238 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Uploading initial image to pithos...")
1239 ad76b118 Dimitris Aragiorgis
    image = "debian_base.diskdump"
1240 ad76b118 Dimitris Aragiorgis
    try_run("wget {0} -O /tmp/{1}".format(env.env.debian_base_url, image))
1241 ad76b118 Dimitris Aragiorgis
    try_run("kamaki file upload --container images /tmp/{0} {0}".format(image))
1242 ad76b118 Dimitris Aragiorgis
1243 ad76b118 Dimitris Aragiorgis
@roles("client")
1244 ad76b118 Dimitris Aragiorgis
def register_image(image="debian_base.diskdump"):
1245 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Register image to plankton...")
1246 9b69ce64 Dimitris Aragiorgis
    with settings(host_string=env.env.db.ip):
1247 ad76b118 Dimitris Aragiorgis
        uid, user_auth_token, user_uuid = get_auth_token_from_db(env.env.user_email)
1248 ad76b118 Dimitris Aragiorgis
1249 24aebd56 Ilias Tsitsimpis
    image_location = "images:{0}".format(image)
1250 ad76b118 Dimitris Aragiorgis
    cmd = """
1251 ad76b118 Dimitris Aragiorgis
    sleep 5
1252 ad76b118 Dimitris Aragiorgis
    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
1253 24aebd56 Ilias Tsitsimpis
    """.format(image_location)
1254 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1255 ad76b118 Dimitris Aragiorgis
1256 ad76b118 Dimitris Aragiorgis
@roles("client")
1257 ad76b118 Dimitris Aragiorgis
def setup_burnin():
1258 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up burnin testing tool...")
1259 ad76b118 Dimitris Aragiorgis
    install_package("kamaki")
1260 ad76b118 Dimitris Aragiorgis
    install_package("snf-tools")
1261 ad76b118 Dimitris Aragiorgis
1262 ad76b118 Dimitris Aragiorgis
@roles("pithos")
1263 ad76b118 Dimitris Aragiorgis
def add_image_locally():
1264 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Getting image locally in order snf-image to use it directly..")
1265 ad76b118 Dimitris Aragiorgis
    image = "debian_base.diskdump"
1266 4baa4696 Dimitris Aragiorgis
    try_run("wget {0} -O {1}/{2}".format(env.env.debian_base_url, env.env.image_dir, image))
1267 ad76b118 Dimitris Aragiorgis
1268 ad76b118 Dimitris Aragiorgis
1269 ad76b118 Dimitris Aragiorgis
@roles("master")
1270 ad76b118 Dimitris Aragiorgis
def gnt_instance_add(name="test"):
1271 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Adding test instance to Ganeti...")
1272 ad76b118 Dimitris Aragiorgis
    osp="""img_passwd=gamwtosecurity,img_format=diskdump,img_id=debian_base,img_properties='{"OSFAMILY":"linux"\,"ROOT_PARTITION":"1"}'"""
1273 ad76b118 Dimitris Aragiorgis
    cmd = """
1274 ad76b118 Dimitris Aragiorgis
    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}
1275 ad76b118 Dimitris Aragiorgis
    """.format(osp, name)
1276 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1277 ad76b118 Dimitris Aragiorgis
1278 ad76b118 Dimitris Aragiorgis
@roles("master")
1279 ad76b118 Dimitris Aragiorgis
def gnt_network_add(name="test", subnet="10.0.0.0/26", gw="10.0.0.1", mode="bridged", link="br0"):
1280 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Adding test network to Ganeti...")
1281 ad76b118 Dimitris Aragiorgis
    cmd = """
1282 ad76b118 Dimitris Aragiorgis
    gnt-network add --network={1} --gateway={2} {0}
1283 ad76b118 Dimitris Aragiorgis
    gnt-network connect {0} {3} {4}
1284 ad76b118 Dimitris Aragiorgis
    """.format(name, subnet, gw, mode, link)
1285 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1286 ad76b118 Dimitris Aragiorgis
1287 ad76b118 Dimitris Aragiorgis
@roles("ips")
1288 ad76b118 Dimitris Aragiorgis
def test():
1289 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Testing...")
1290 ad76b118 Dimitris Aragiorgis
    try_run("hostname && date")