Statistics
| Branch: | Tag: | Revision:

root / snf-deploy / fabfile.py @ 9772cb94

History | View | Annotate | Download (40.8 kB)

1 215f94f4 Ilias Tsitsimpis
# Too many lines in module pylint: disable-msg=C0302
2 215f94f4 Ilias Tsitsimpis
# Too many arguments (7/5) pylint: disable-msg=R0913
3 215f94f4 Ilias Tsitsimpis
"""
4 215f94f4 Ilias Tsitsimpis
Fabric file for snf-deploy
5 215f94f4 Ilias Tsitsimpis

6 215f94f4 Ilias Tsitsimpis
"""
7 215f94f4 Ilias Tsitsimpis
8 ad76b118 Dimitris Aragiorgis
from __future__ import with_statement
9 215f94f4 Ilias Tsitsimpis
from fabric.api import hide, env, settings, local, roles
10 215f94f4 Ilias Tsitsimpis
from fabric.operations import run, put, get
11 ad76b118 Dimitris Aragiorgis
import re
12 215f94f4 Ilias Tsitsimpis
import os
13 215f94f4 Ilias Tsitsimpis
import shutil
14 ad76b118 Dimitris Aragiorgis
import tempfile
15 ad76b118 Dimitris Aragiorgis
import ast
16 215f94f4 Ilias Tsitsimpis
from snfdeploy.lib import debug, Conf, Env, disable_color
17 ad76b118 Dimitris Aragiorgis
from snfdeploy import massedit
18 ad76b118 Dimitris Aragiorgis
19 ad76b118 Dimitris Aragiorgis
20 215f94f4 Ilias Tsitsimpis
def setup_env(confdir="conf", packages="packages", templates="files",
21 215f94f4 Ilias Tsitsimpis
              cluster_name="ganeti1", autoconf=False, disable_colors=False,
22 215f94f4 Ilias Tsitsimpis
              key_inject=False):
23 215f94f4 Ilias Tsitsimpis
    """Setup environment"""
24 ad76b118 Dimitris Aragiorgis
    print("Loading configuration for synnefo...")
25 ad76b118 Dimitris Aragiorgis
    print(" * Using config files under %s..." % confdir)
26 215f94f4 Ilias Tsitsimpis
    print(" * Using %s and %s for packages and templates accordingly..."
27 215f94f4 Ilias Tsitsimpis
          % (packages, templates))
28 ad76b118 Dimitris Aragiorgis
29 ad76b118 Dimitris Aragiorgis
    autoconf = ast.literal_eval(autoconf)
30 b7c00e75 Dionysis Grigoropoulos
    disable_colors = ast.literal_eval(disable_colors)
31 e5b4db06 Dimitris Aragiorgis
    env.key_inject = ast.literal_eval(key_inject)
32 215f94f4 Ilias Tsitsimpis
    conf = Conf.configure(confdir=confdir, cluster_name=cluster_name,
33 215f94f4 Ilias Tsitsimpis
                          autoconf=autoconf)
34 ad76b118 Dimitris Aragiorgis
    env.env = Env(conf)
35 ad76b118 Dimitris Aragiorgis
36 ad76b118 Dimitris Aragiorgis
    env.local = autoconf
37 ad76b118 Dimitris Aragiorgis
    env.password = env.env.password
38 ad76b118 Dimitris Aragiorgis
    env.user = env.env.user
39 ad76b118 Dimitris Aragiorgis
    env.shell = "/bin/bash -c"
40 ad76b118 Dimitris Aragiorgis
41 b7c00e75 Dionysis Grigoropoulos
    if disable_colors:
42 b7c00e75 Dionysis Grigoropoulos
        disable_color()
43 b7c00e75 Dionysis Grigoropoulos
44 215f94f4 Ilias Tsitsimpis
    if env.env.cms.hostname in \
45 215f94f4 Ilias Tsitsimpis
            [env.env.accounts.hostname, env.env.cyclades.hostname,
46 215f94f4 Ilias Tsitsimpis
             env.env.pithos.hostname]:
47 215f94f4 Ilias Tsitsimpis
        env.cms_pass = True
48 ad76b118 Dimitris Aragiorgis
    else:
49 215f94f4 Ilias Tsitsimpis
        env.cms_pass = False
50 ad76b118 Dimitris Aragiorgis
51 215f94f4 Ilias Tsitsimpis
    if env.env.accounts.hostname in \
52 215f94f4 Ilias Tsitsimpis
            [env.env.cyclades.hostname, env.env.pithos.hostname]:
53 215f94f4 Ilias Tsitsimpis
        env.csrf_disable = True
54 ad76b118 Dimitris Aragiorgis
    else:
55 215f94f4 Ilias Tsitsimpis
        env.csrf_disable = False
56 ad76b118 Dimitris Aragiorgis
57 ad76b118 Dimitris Aragiorgis
    env.roledefs = {
58 ad76b118 Dimitris Aragiorgis
        "nodes": env.env.ips,
59 ad76b118 Dimitris Aragiorgis
        "ips": env.env.ips,
60 ad76b118 Dimitris Aragiorgis
        "accounts": [env.env.accounts.ip],
61 ad76b118 Dimitris Aragiorgis
        "cyclades": [env.env.cyclades.ip],
62 ad76b118 Dimitris Aragiorgis
        "pithos": [env.env.pithos.ip],
63 ad76b118 Dimitris Aragiorgis
        "cms": [env.env.cms.ip],
64 ad76b118 Dimitris Aragiorgis
        "mq": [env.env.mq.ip],
65 ad76b118 Dimitris Aragiorgis
        "db": [env.env.db.ip],
66 215f94f4 Ilias Tsitsimpis
        "mq": [env.env.mq.ip],
67 215f94f4 Ilias Tsitsimpis
        "db": [env.env.db.ip],
68 ad76b118 Dimitris Aragiorgis
        "ns": [env.env.ns.ip],
69 ad76b118 Dimitris Aragiorgis
        "client": [env.env.client.ip],
70 ad76b118 Dimitris Aragiorgis
        "router": [env.env.router.ip],
71 ad76b118 Dimitris Aragiorgis
    }
72 ad76b118 Dimitris Aragiorgis
73 ad76b118 Dimitris Aragiorgis
    env.enable_lvm = False
74 ad76b118 Dimitris Aragiorgis
    env.enable_drbd = False
75 ad76b118 Dimitris Aragiorgis
    if ast.literal_eval(env.env.create_extra_disk) and env.env.extra_disk:
76 ad76b118 Dimitris Aragiorgis
        env.enable_lvm = True
77 ad76b118 Dimitris Aragiorgis
        env.enable_drbd = True
78 ad76b118 Dimitris Aragiorgis
79 ad76b118 Dimitris Aragiorgis
    env.roledefs.update({
80 ad76b118 Dimitris Aragiorgis
        "ganeti": env.env.cluster_ips,
81 ad76b118 Dimitris Aragiorgis
        "master": [env.env.master.ip],
82 ad76b118 Dimitris Aragiorgis
    })
83 ad76b118 Dimitris Aragiorgis
84 ad76b118 Dimitris Aragiorgis
85 ad76b118 Dimitris Aragiorgis
def install_package(package):
86 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Installing package %s..." % package)
87 215f94f4 Ilias Tsitsimpis
    apt_get = "export DEBIAN_FRONTEND=noninteractive ;" + \
88 215f94f4 Ilias Tsitsimpis
              "apt-get install -y --force-yes "
89 ad76b118 Dimitris Aragiorgis
90 f9b1abe8 Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
91 e083e94c Dimitris Aragiorgis
    env.env.update_packages(host_info.os)
92 ad76b118 Dimitris Aragiorgis
    if ast.literal_eval(env.env.use_local_packages):
93 ad76b118 Dimitris Aragiorgis
        with settings(warn_only=True):
94 215f94f4 Ilias Tsitsimpis
            deb = local("ls %s/%s*%s_all.deb"
95 215f94f4 Ilias Tsitsimpis
                        % (env.env.packages, package, host_info.os),
96 90422c05 Ilias Tsitsimpis
                        capture=True)
97 ad76b118 Dimitris Aragiorgis
            if deb:
98 215f94f4 Ilias Tsitsimpis
                debug(env.host,
99 215f94f4 Ilias Tsitsimpis
                      " * Package %s found in %s..."
100 215f94f4 Ilias Tsitsimpis
                      % (package, env.env.packages))
101 ad76b118 Dimitris Aragiorgis
                put(deb, "/tmp/")
102 215f94f4 Ilias Tsitsimpis
                try_run("dpkg -i /tmp/%s || "
103 215f94f4 Ilias Tsitsimpis
                        % os.path.basename(deb) + apt_get + "-f")
104 e083e94c Dimitris Aragiorgis
                try_run("rm /tmp/%s" % os.path.basename(deb))
105 ad76b118 Dimitris Aragiorgis
                return
106 ad76b118 Dimitris Aragiorgis
107 ad76b118 Dimitris Aragiorgis
    info = getattr(env.env, package)
108 215f94f4 Ilias Tsitsimpis
    if info in \
109 215f94f4 Ilias Tsitsimpis
            ["squeeze-backports", "squeeze", "stable",
110 215f94f4 Ilias Tsitsimpis
             "testing", "unstable", "wheezy"]:
111 215f94f4 Ilias Tsitsimpis
        apt_get += " -t %s %s " % (info, package)
112 ad76b118 Dimitris Aragiorgis
    elif info:
113 215f94f4 Ilias Tsitsimpis
        apt_get += " %s=%s " % (package, info)
114 ad76b118 Dimitris Aragiorgis
    else:
115 215f94f4 Ilias Tsitsimpis
        apt_get += package
116 ad76b118 Dimitris Aragiorgis
117 215f94f4 Ilias Tsitsimpis
    try_run(apt_get)
118 ad76b118 Dimitris Aragiorgis
119 ad76b118 Dimitris Aragiorgis
    return
120 ad76b118 Dimitris Aragiorgis
121 ad76b118 Dimitris Aragiorgis
122 ad76b118 Dimitris Aragiorgis
@roles("ns")
123 ad76b118 Dimitris Aragiorgis
def update_ns_for_ganeti():
124 215f94f4 Ilias Tsitsimpis
    debug(env.host,
125 215f94f4 Ilias Tsitsimpis
          "Updating name server entries for backend %s..."
126 215f94f4 Ilias Tsitsimpis
          % env.env.cluster.fqdn)
127 ad76b118 Dimitris Aragiorgis
    update_arecord(env.env.cluster)
128 ad76b118 Dimitris Aragiorgis
    update_ptrrecord(env.env.cluster)
129 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/bind9 restart")
130 ad76b118 Dimitris Aragiorgis
131 ad76b118 Dimitris Aragiorgis
132 ad76b118 Dimitris Aragiorgis
@roles("ns")
133 ad76b118 Dimitris Aragiorgis
def update_ns_for_node(node):
134 ad76b118 Dimitris Aragiorgis
    info = env.env.nodes_info.get(node)
135 ad76b118 Dimitris Aragiorgis
    update_arecord(info)
136 ad76b118 Dimitris Aragiorgis
    update_ptrrecord(info)
137 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/bind9 restart")
138 ad76b118 Dimitris Aragiorgis
139 ad76b118 Dimitris Aragiorgis
140 ad76b118 Dimitris Aragiorgis
@roles("ns")
141 ad76b118 Dimitris Aragiorgis
def update_arecord(host):
142 ad76b118 Dimitris Aragiorgis
    filename = "/etc/bind/zones/" + env.env.domain
143 ad76b118 Dimitris Aragiorgis
    cmd = """
144 ad76b118 Dimitris Aragiorgis
    echo '{0}' >> {1}
145 ad76b118 Dimitris Aragiorgis
    """.format(host.arecord, filename)
146 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
147 ad76b118 Dimitris Aragiorgis
148 ad76b118 Dimitris Aragiorgis
149 ad76b118 Dimitris Aragiorgis
@roles("ns")
150 ad76b118 Dimitris Aragiorgis
def update_cnamerecord(host):
151 ad76b118 Dimitris Aragiorgis
    filename = "/etc/bind/zones/" + env.env.domain
152 ad76b118 Dimitris Aragiorgis
    cmd = """
153 ad76b118 Dimitris Aragiorgis
    echo '{0}' >> {1}
154 ad76b118 Dimitris Aragiorgis
    """.format(host.cnamerecord, filename)
155 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
156 ad76b118 Dimitris Aragiorgis
157 ad76b118 Dimitris Aragiorgis
158 ad76b118 Dimitris Aragiorgis
@roles("ns")
159 ad76b118 Dimitris Aragiorgis
def update_ptrrecord(host):
160 ad76b118 Dimitris Aragiorgis
    filename = "/etc/bind/rev/synnefo.in-addr.arpa.zone"
161 ad76b118 Dimitris Aragiorgis
    cmd = """
162 ad76b118 Dimitris Aragiorgis
    echo '{0}' >> {1}
163 ad76b118 Dimitris Aragiorgis
    """.format(host.ptrrecord, filename)
164 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
165 ad76b118 Dimitris Aragiorgis
166 215f94f4 Ilias Tsitsimpis
167 ad76b118 Dimitris Aragiorgis
@roles("nodes")
168 ad76b118 Dimitris Aragiorgis
def apt_get_update():
169 ad76b118 Dimitris Aragiorgis
    debug(env.host, "apt-get update....")
170 ad76b118 Dimitris Aragiorgis
    try_run("apt-get update")
171 ad76b118 Dimitris Aragiorgis
172 215f94f4 Ilias Tsitsimpis
173 ad76b118 Dimitris Aragiorgis
@roles("ns")
174 ad76b118 Dimitris Aragiorgis
def setup_ns():
175 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up name server..")
176 ad76b118 Dimitris Aragiorgis
    #WARNING: this should be remove after we are done
177 ad76b118 Dimitris Aragiorgis
    # because gevent does pick randomly nameservers and google does
178 ad76b118 Dimitris Aragiorgis
    # not know our setup!!!!!
179 ad76b118 Dimitris Aragiorgis
    apt_get_update()
180 ad76b118 Dimitris Aragiorgis
    install_package("bind9")
181 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/bind/named.conf.local"
182 ad76b118 Dimitris Aragiorgis
    replace = {
183 215f94f4 Ilias Tsitsimpis
        "domain": env.env.domain,
184 215f94f4 Ilias Tsitsimpis
    }
185 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
186 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
187 ad76b118 Dimitris Aragiorgis
188 ad76b118 Dimitris Aragiorgis
    try_run("mkdir -p /etc/bind/zones")
189 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/bind/zones/example.com"
190 ad76b118 Dimitris Aragiorgis
    replace = {
191 215f94f4 Ilias Tsitsimpis
        "domain": env.env.domain,
192 215f94f4 Ilias Tsitsimpis
        "ns_node_ip": env.env.ns.ip,
193 215f94f4 Ilias Tsitsimpis
    }
194 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
195 ad76b118 Dimitris Aragiorgis
    remote = "/etc/bind/zones/" + env.env.domain
196 ad76b118 Dimitris Aragiorgis
    put(custom, remote)
197 ad76b118 Dimitris Aragiorgis
198 ad76b118 Dimitris Aragiorgis
    try_run("mkdir -p /etc/bind/rev")
199 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/bind/rev/synnefo.in-addr.arpa.zone"
200 ad76b118 Dimitris Aragiorgis
    replace = {
201 215f94f4 Ilias Tsitsimpis
        "domain": env.env.domain,
202 215f94f4 Ilias Tsitsimpis
    }
203 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
204 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
205 ad76b118 Dimitris Aragiorgis
206 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/bind/named.conf.options"
207 ad76b118 Dimitris Aragiorgis
    replace = {
208 215f94f4 Ilias Tsitsimpis
        "NODE_IPS": ";".join(env.env.ips),
209 215f94f4 Ilias Tsitsimpis
    }
210 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
211 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
212 ad76b118 Dimitris Aragiorgis
213 ad76b118 Dimitris Aragiorgis
    for role, info in env.env.roles.iteritems():
214 ad76b118 Dimitris Aragiorgis
        if role == "ns":
215 ad76b118 Dimitris Aragiorgis
            continue
216 ad76b118 Dimitris Aragiorgis
        update_cnamerecord(info)
217 ad76b118 Dimitris Aragiorgis
    for node, info in env.env.nodes_info.iteritems():
218 ad76b118 Dimitris Aragiorgis
        update_arecord(info)
219 ad76b118 Dimitris Aragiorgis
        update_ptrrecord(info)
220 ad76b118 Dimitris Aragiorgis
221 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/bind9 restart")
222 ad76b118 Dimitris Aragiorgis
223 ad76b118 Dimitris Aragiorgis
224 ad76b118 Dimitris Aragiorgis
@roles("nodes")
225 ad76b118 Dimitris Aragiorgis
def check_dhcp():
226 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Checking IPs for synnefo..")
227 ad76b118 Dimitris Aragiorgis
    for n, info in env.env.nodes_info.iteritems():
228 de6f7d9b Dimitris Aragiorgis
        try_run("ping -c 1 " + info.ip, True)
229 ad76b118 Dimitris Aragiorgis
230 215f94f4 Ilias Tsitsimpis
231 ad76b118 Dimitris Aragiorgis
@roles("nodes")
232 ad76b118 Dimitris Aragiorgis
def check_dns():
233 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Checking fqdns for synnefo..")
234 ad76b118 Dimitris Aragiorgis
    for n, info in env.env.nodes_info.iteritems():
235 de6f7d9b Dimitris Aragiorgis
        try_run("ping -c 1 " + info.fqdn, True)
236 ad76b118 Dimitris Aragiorgis
237 ad76b118 Dimitris Aragiorgis
    for n, info in env.env.roles.iteritems():
238 de6f7d9b Dimitris Aragiorgis
        try_run("ping -c 1 " + info.fqdn, True)
239 ad76b118 Dimitris Aragiorgis
240 215f94f4 Ilias Tsitsimpis
241 ad76b118 Dimitris Aragiorgis
@roles("nodes")
242 ad76b118 Dimitris Aragiorgis
def check_connectivity():
243 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Checking internet connectivity..")
244 de6f7d9b Dimitris Aragiorgis
    try_run("ping -c 1 www.google.com", True)
245 ad76b118 Dimitris Aragiorgis
246 ad76b118 Dimitris Aragiorgis
247 ad76b118 Dimitris Aragiorgis
@roles("nodes")
248 ad76b118 Dimitris Aragiorgis
def check_ssh():
249 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Checking password-less ssh..")
250 ad76b118 Dimitris Aragiorgis
    for n, info in env.env.nodes_info.iteritems():
251 de6f7d9b Dimitris Aragiorgis
        try_run("ssh " + info.fqdn + "  date", True)
252 ad76b118 Dimitris Aragiorgis
253 ad76b118 Dimitris Aragiorgis
254 ad76b118 Dimitris Aragiorgis
@roles("ips")
255 ad76b118 Dimitris Aragiorgis
def add_keys():
256 e5b4db06 Dimitris Aragiorgis
    if not env.key_inject:
257 215f94f4 Ilias Tsitsimpis
        debug(env.host, "Skipping ssh keys injection..")
258 215f94f4 Ilias Tsitsimpis
        return
259 e5b4db06 Dimitris Aragiorgis
    else:
260 215f94f4 Ilias Tsitsimpis
        debug(env.host, "Adding rsa/dsa keys..")
261 ad76b118 Dimitris Aragiorgis
    try_run("mkdir -p /root/.ssh")
262 ad76b118 Dimitris Aragiorgis
    cmd = """
263 ad76b118 Dimitris Aragiorgis
for f in $(ls /root/.ssh/*); do
264 ad76b118 Dimitris Aragiorgis
  cp $f $f.bak
265 ad76b118 Dimitris Aragiorgis
done
266 ad76b118 Dimitris Aragiorgis
    """
267 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
268 ad76b118 Dimitris Aragiorgis
    files = ["authorized_keys", "id_dsa", "id_dsa.pub",
269 ad76b118 Dimitris Aragiorgis
             "id_rsa", "id_rsa.pub"]
270 ad76b118 Dimitris Aragiorgis
    for f in files:
271 215f94f4 Ilias Tsitsimpis
        tmpl = "/root/.ssh/" + f
272 215f94f4 Ilias Tsitsimpis
        replace = {}
273 215f94f4 Ilias Tsitsimpis
        custom = customize_settings_from_tmpl(tmpl, replace)
274 215f94f4 Ilias Tsitsimpis
        put(custom, tmpl, mode=0600)
275 ad76b118 Dimitris Aragiorgis
276 ad76b118 Dimitris Aragiorgis
    cmd = """
277 ad76b118 Dimitris Aragiorgis
if [ -e /root/.ssh/authorized_keys.bak ]; then
278 ad76b118 Dimitris Aragiorgis
  cat /root/.ssh/authorized_keys.bak >> /root/.ssh/authorized_keys
279 ad76b118 Dimitris Aragiorgis
fi
280 ad76b118 Dimitris Aragiorgis
    """
281 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Updating exising authorized keys..")
282 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
283 ad76b118 Dimitris Aragiorgis
284 215f94f4 Ilias Tsitsimpis
285 ad76b118 Dimitris Aragiorgis
@roles("ips")
286 ad76b118 Dimitris Aragiorgis
def setup_resolv_conf():
287 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Tweak /etc/resolv.conf...")
288 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/network-manager stop")
289 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/dhcp/dhclient-enter-hooks.d/nodnsupdate"
290 ad76b118 Dimitris Aragiorgis
    replace = {}
291 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
292 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
293 ad76b118 Dimitris Aragiorgis
    try_run("cp /etc/resolv.conf /etc/resolv.conf.bak")
294 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/resolv.conf"
295 ad76b118 Dimitris Aragiorgis
    replace = {
296 215f94f4 Ilias Tsitsimpis
        "domain": env.env.domain,
297 215f94f4 Ilias Tsitsimpis
        "ns_node_ip": env.env.ns.ip,
298 215f94f4 Ilias Tsitsimpis
    }
299 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
300 176829d7 Dimitris Aragiorgis
    try:
301 215f94f4 Ilias Tsitsimpis
        put(custom, tmpl)
302 9772cb94 Ilias Tsitsimpis
        cmd = """
303 9772cb94 Ilias Tsitsimpis
        echo "\
304 9772cb94 Ilias Tsitsimpis
# This has been generated automatically by snf-deploy, at
305 9772cb94 Ilias Tsitsimpis
# $(date).
306 9772cb94 Ilias Tsitsimpis
# The immutable bit (+i attribute) has been used to avoid it being
307 9772cb94 Ilias Tsitsimpis
# overwritten by software such as NetworkManager or resolvconf.
308 9772cb94 Ilias Tsitsimpis
# Use lsattr/chattr to view or modify its file attributes.
309 9772cb94 Ilias Tsitsimpis

310 9772cb94 Ilias Tsitsimpis

311 9772cb94 Ilias Tsitsimpis
$(cat {0})" > {0}
312 9772cb94 Ilias Tsitsimpis
""".format(tmpl)
313 9772cb94 Ilias Tsitsimpis
        try_run(cmd)
314 176829d7 Dimitris Aragiorgis
    except:
315 215f94f4 Ilias Tsitsimpis
        pass
316 ad76b118 Dimitris Aragiorgis
    try_run("chattr +i /etc/resolv.conf")
317 ad76b118 Dimitris Aragiorgis
318 ad76b118 Dimitris Aragiorgis
319 ad76b118 Dimitris Aragiorgis
@roles("ips")
320 ad76b118 Dimitris Aragiorgis
def setup_hosts():
321 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Tweaking /etc/hosts and ssh_config files...")
322 ad76b118 Dimitris Aragiorgis
    try_run("echo StrictHostKeyChecking no >> /etc/ssh/ssh_config")
323 0fd77bd5 Dimitris Aragiorgis
    cmd = "sed -i 's/^127.*$/127.0.0.1 localhost/g' /etc/hosts "
324 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
325 383f2efd Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
326 383f2efd Dimitris Aragiorgis
    cmd = "hostname %s" % host_info.hostname
327 383f2efd Dimitris Aragiorgis
    try_run(cmd)
328 383f2efd Dimitris Aragiorgis
    cmd = "echo %s > /etc/hostname" % host_info.hostname
329 383f2efd Dimitris Aragiorgis
    try_run(cmd)
330 ad76b118 Dimitris Aragiorgis
331 ad76b118 Dimitris Aragiorgis
332 de6f7d9b Dimitris Aragiorgis
def try_run(cmd, abort=False):
333 ad76b118 Dimitris Aragiorgis
    try:
334 215f94f4 Ilias Tsitsimpis
        if env.local:
335 215f94f4 Ilias Tsitsimpis
            return local(cmd, capture=True)
336 215f94f4 Ilias Tsitsimpis
        else:
337 215f94f4 Ilias Tsitsimpis
            return run(cmd)
338 ad76b118 Dimitris Aragiorgis
    except:
339 215f94f4 Ilias Tsitsimpis
        debug(env.host, "WARNING: command failed. Continuing anyway...")
340 215f94f4 Ilias Tsitsimpis
        if abort:
341 215f94f4 Ilias Tsitsimpis
            raise
342 215f94f4 Ilias Tsitsimpis
343 ad76b118 Dimitris Aragiorgis
344 ad76b118 Dimitris Aragiorgis
def create_bridges():
345 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Creating bridges...")
346 ad76b118 Dimitris Aragiorgis
    install_package("bridge-utils")
347 ad76b118 Dimitris Aragiorgis
    cmd = """
348 ad76b118 Dimitris Aragiorgis
    brctl addbr {0} ; ip link set {0} up
349 ad76b118 Dimitris Aragiorgis
    """.format(env.env.common_bridge)
350 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
351 ad76b118 Dimitris Aragiorgis
352 ad76b118 Dimitris Aragiorgis
353 ad76b118 Dimitris Aragiorgis
def connect_bridges():
354 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Connecting bridges...")
355 215f94f4 Ilias Tsitsimpis
    #cmd = """
356 215f94f4 Ilias Tsitsimpis
    #brctl addif {0} {1}
357 215f94f4 Ilias Tsitsimpis
    #""".format(env.env.common_bridge, env.env.public_iface)
358 ad76b118 Dimitris Aragiorgis
    #try_run(cmd)
359 ad76b118 Dimitris Aragiorgis
360 ad76b118 Dimitris Aragiorgis
361 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
362 ad76b118 Dimitris Aragiorgis
def setup_net_infra():
363 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setup networking infrastracture..")
364 ad76b118 Dimitris Aragiorgis
    create_bridges()
365 ad76b118 Dimitris Aragiorgis
    connect_bridges()
366 ad76b118 Dimitris Aragiorgis
367 ad76b118 Dimitris Aragiorgis
368 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
369 ad76b118 Dimitris Aragiorgis
def setup_lvm():
370 ad76b118 Dimitris Aragiorgis
    debug(env.host, "create volume group %s for ganeti.." % env.env.vg)
371 ad76b118 Dimitris Aragiorgis
    if env.enable_lvm:
372 ad76b118 Dimitris Aragiorgis
        install_package("lvm2")
373 ad76b118 Dimitris Aragiorgis
        cmd = """
374 ad76b118 Dimitris Aragiorgis
        pvcreate {0}
375 ad76b118 Dimitris Aragiorgis
        vgcreate {1} {0}
376 ad76b118 Dimitris Aragiorgis
        """.format(env.env.extra_disk, env.env.vg)
377 ad76b118 Dimitris Aragiorgis
        try_run(cmd)
378 ad76b118 Dimitris Aragiorgis
379 ad76b118 Dimitris Aragiorgis
380 ad76b118 Dimitris Aragiorgis
def customize_settings_from_tmpl(tmpl, replace):
381 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Customizing template %s..." % tmpl)
382 ad76b118 Dimitris Aragiorgis
    local = env.env.templates + tmpl
383 ad76b118 Dimitris Aragiorgis
    _, custom = tempfile.mkstemp()
384 ad76b118 Dimitris Aragiorgis
    shutil.copyfile(local, custom)
385 ad76b118 Dimitris Aragiorgis
    for k, v in replace.iteritems():
386 ad76b118 Dimitris Aragiorgis
        regex = "re.sub('%{0}%', '{1}', line)".format(k.upper(), v)
387 ad76b118 Dimitris Aragiorgis
        massedit.edit_files([custom], [regex], dry_run=False)
388 ad76b118 Dimitris Aragiorgis
389 ad76b118 Dimitris Aragiorgis
    return custom
390 ad76b118 Dimitris Aragiorgis
391 ad76b118 Dimitris Aragiorgis
392 ad76b118 Dimitris Aragiorgis
@roles("nodes")
393 ad76b118 Dimitris Aragiorgis
def setup_apt():
394 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up apt sources...")
395 ad76b118 Dimitris Aragiorgis
    install_package("curl")
396 ad76b118 Dimitris Aragiorgis
    cmd = """
397 ad76b118 Dimitris Aragiorgis
    echo 'APT::Install-Suggests "false";' >> /etc/apt/apt.conf
398 ad76b118 Dimitris Aragiorgis
    curl -k https://dev.grnet.gr/files/apt-grnetdev.pub | apt-key add -
399 ad76b118 Dimitris Aragiorgis
    """
400 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
401 f9b1abe8 Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
402 f9b1abe8 Dimitris Aragiorgis
    if host_info.os == "squeeze":
403 215f94f4 Ilias Tsitsimpis
        tmpl = "/etc/apt/sources.list.d/synnefo.squeeze.list"
404 f9b1abe8 Dimitris Aragiorgis
    else:
405 215f94f4 Ilias Tsitsimpis
        tmpl = "/etc/apt/sources.list.d/synnefo.wheezy.list"
406 ad76b118 Dimitris Aragiorgis
    replace = {}
407 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
408 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
409 ad76b118 Dimitris Aragiorgis
    apt_get_update()
410 ad76b118 Dimitris Aragiorgis
411 ad76b118 Dimitris Aragiorgis
412 ad76b118 Dimitris Aragiorgis
@roles("cyclades", "cms", "pithos", "accounts")
413 ad76b118 Dimitris Aragiorgis
def restart_services():
414 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Restarting apache2 and gunicorn...")
415 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
416 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/apache2 restart")
417 ad76b118 Dimitris Aragiorgis
418 ad76b118 Dimitris Aragiorgis
419 ad76b118 Dimitris Aragiorgis
def setup_gunicorn():
420 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up gunicorn...")
421 ad76b118 Dimitris Aragiorgis
    install_package("gunicorn")
422 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/gunicorn.d/synnefo"
423 ad76b118 Dimitris Aragiorgis
    replace = {}
424 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
425 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
426 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
427 ad76b118 Dimitris Aragiorgis
428 ad76b118 Dimitris Aragiorgis
429 ad76b118 Dimitris Aragiorgis
def setup_apache():
430 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up apache2...")
431 ad76b118 Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
432 ad76b118 Dimitris Aragiorgis
    install_package("apache2")
433 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/apache2/sites-available/synnefo"
434 ad76b118 Dimitris Aragiorgis
    replace = {
435 ad76b118 Dimitris Aragiorgis
        "HOST": host_info.fqdn,
436 ad76b118 Dimitris Aragiorgis
    }
437 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
438 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
439 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/apache2/sites-available/synnefo-ssl"
440 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
441 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
442 ad76b118 Dimitris Aragiorgis
    cmd = """
443 ad76b118 Dimitris Aragiorgis
    a2enmod ssl
444 ad76b118 Dimitris Aragiorgis
    a2enmod rewrite
445 ad76b118 Dimitris Aragiorgis
    a2dissite default
446 ad76b118 Dimitris Aragiorgis
    a2ensite synnefo
447 ad76b118 Dimitris Aragiorgis
    a2ensite synnefo-ssl
448 ad76b118 Dimitris Aragiorgis
    a2enmod headers
449 ad76b118 Dimitris Aragiorgis
    a2enmod proxy_http
450 ad76b118 Dimitris Aragiorgis
    a2dismod autoindex
451 ad76b118 Dimitris Aragiorgis
    """
452 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
453 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/apache2 restart")
454 ad76b118 Dimitris Aragiorgis
455 ad76b118 Dimitris Aragiorgis
456 ad76b118 Dimitris Aragiorgis
@roles("mq")
457 ad76b118 Dimitris Aragiorgis
def setup_mq():
458 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up RabbitMQ...")
459 ad76b118 Dimitris Aragiorgis
    install_package("rabbitmq-server")
460 ad76b118 Dimitris Aragiorgis
    cmd = """
461 ad76b118 Dimitris Aragiorgis
    rabbitmqctl add_user {0} {1}
462 ad76b118 Dimitris Aragiorgis
    rabbitmqctl set_permissions {0} ".*" ".*" ".*"
463 ad76b118 Dimitris Aragiorgis
    rabbitmqctl delete_user guest
464 ad76b118 Dimitris Aragiorgis
    rabbitmqctl set_user_tags {0} administrator
465 ad76b118 Dimitris Aragiorgis
    """.format(env.env.synnefo_user, env.env.synnefo_rabbitmq_passwd)
466 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
467 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/rabbitmq-server restart")
468 ad76b118 Dimitris Aragiorgis
469 ad76b118 Dimitris Aragiorgis
470 ad76b118 Dimitris Aragiorgis
@roles("db")
471 7474f035 Dimitris Aragiorgis
def allow_access_in_db(ip, user="all", method="md5"):
472 ad76b118 Dimitris Aragiorgis
    cmd = """
473 bf0e2a03 Ilias Tsitsimpis
    pg_hba=$(ls /etc/postgresql/*/main/pg_hba.conf)
474 bf0e2a03 Ilias Tsitsimpis
    echo host all {0} {1}/32 {2} >> $pg_hba
475 7474f035 Dimitris Aragiorgis
    """.format(user, ip, method)
476 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
477 36848a52 Christos Stavrakakis
    cmd = """
478 bf0e2a03 Ilias Tsitsimpis
    pg_hba=$(ls /etc/postgresql/*/main/pg_hba.conf)
479 bf0e2a03 Ilias Tsitsimpis
    sed -i 's/\(host.*127.0.0.1.*\)md5/\\1trust/' $pg_hba
480 36848a52 Christos Stavrakakis
    """
481 36848a52 Christos Stavrakakis
    try_run(cmd)
482 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/postgresql restart")
483 ad76b118 Dimitris Aragiorgis
484 215f94f4 Ilias Tsitsimpis
485 ad76b118 Dimitris Aragiorgis
@roles("db")
486 ad76b118 Dimitris Aragiorgis
def setup_db():
487 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up DataBase server...")
488 ad76b118 Dimitris Aragiorgis
    install_package("postgresql")
489 ad76b118 Dimitris Aragiorgis
490 ad76b118 Dimitris Aragiorgis
    tmpl = "/tmp/db-init.psql"
491 ad76b118 Dimitris Aragiorgis
    replace = {
492 ad76b118 Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
493 ad76b118 Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
494 ad76b118 Dimitris Aragiorgis
        }
495 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
496 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
497 ad76b118 Dimitris Aragiorgis
    cmd = 'su - postgres -c "psql -w -f %s" ' % tmpl
498 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
499 ad76b118 Dimitris Aragiorgis
    cmd = """
500 bf0e2a03 Ilias Tsitsimpis
    conf=$(ls /etc/postgresql/*/main/postgresql.conf)
501 bf0e2a03 Ilias Tsitsimpis
    echo "listen_addresses = '*'" >> $conf
502 ad76b118 Dimitris Aragiorgis
    """
503 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
504 ad76b118 Dimitris Aragiorgis
505 8ed8742f Christos Stavrakakis
    if env.env.testing_vm:
506 8ed8742f Christos Stavrakakis
        cmd = """
507 bf0e2a03 Ilias Tsitsimpis
        conf=$(ls /etc/postgresql/*/main/postgresql.conf)
508 bf0e2a03 Ilias Tsitsimpis
        echo "fsync=off\nsynchronous_commit=off\nfull_page_writes=off" >> $conf
509 8ed8742f Christos Stavrakakis
        """
510 8ed8742f Christos Stavrakakis
        try_run(cmd)
511 8ed8742f Christos Stavrakakis
512 7474f035 Dimitris Aragiorgis
    allow_access_in_db(env.host, "all", "trust")
513 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/postgresql restart")
514 ad76b118 Dimitris Aragiorgis
515 ad76b118 Dimitris Aragiorgis
516 ad76b118 Dimitris Aragiorgis
@roles("db")
517 ad76b118 Dimitris Aragiorgis
def destroy_db():
518 ad76b118 Dimitris Aragiorgis
    try_run("""su - postgres -c ' psql -w -c "drop database snf_apps" '""")
519 ad76b118 Dimitris Aragiorgis
    try_run("""su - postgres -c ' psql -w -c "drop database snf_pithos" '""")
520 ad76b118 Dimitris Aragiorgis
521 ad76b118 Dimitris Aragiorgis
522 ad76b118 Dimitris Aragiorgis
def setup_webproject():
523 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up snf-webproject...")
524 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
525 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.db.ip)
526 ad76b118 Dimitris Aragiorgis
    setup_common()
527 ad76b118 Dimitris Aragiorgis
    install_package("snf-webproject")
528 ad76b118 Dimitris Aragiorgis
    install_package("python-psycopg2")
529 ad76b118 Dimitris Aragiorgis
    install_package("python-gevent")
530 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/webproject.conf"
531 ad76b118 Dimitris Aragiorgis
    replace = {
532 ad76b118 Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
533 ad76b118 Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
534 ad76b118 Dimitris Aragiorgis
        "db_node": env.env.db.ip,
535 ad76b118 Dimitris Aragiorgis
        "domain": env.env.domain,
536 ad76b118 Dimitris Aragiorgis
    }
537 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
538 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
539 9b69ce64 Dimitris Aragiorgis
    with settings(host_string=env.env.db.ip):
540 ad76b118 Dimitris Aragiorgis
        host_info = env.env.ips_info[env.host]
541 7474f035 Dimitris Aragiorgis
        allow_access_in_db(host_info.ip, "all", "trust")
542 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
543 ad76b118 Dimitris Aragiorgis
544 ad76b118 Dimitris Aragiorgis
545 ad76b118 Dimitris Aragiorgis
def setup_common():
546 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up snf-common...")
547 ad76b118 Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
548 ad76b118 Dimitris Aragiorgis
    install_package("python-objpool")
549 ad76b118 Dimitris Aragiorgis
    install_package("snf-common")
550 ad76b118 Dimitris Aragiorgis
    install_package("python-astakosclient")
551 ad76b118 Dimitris Aragiorgis
    install_package("snf-django-lib")
552 ad76b118 Dimitris Aragiorgis
    install_package("snf-branding")
553 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/common.conf"
554 ad76b118 Dimitris Aragiorgis
    replace = {
555 ad76b118 Dimitris Aragiorgis
        #FIXME:
556 ad76b118 Dimitris Aragiorgis
        "EMAIL_SUBJECT_PREFIX": env.host,
557 ad76b118 Dimitris Aragiorgis
        "domain": env.env.domain,
558 ad76b118 Dimitris Aragiorgis
        "HOST": host_info.fqdn,
559 2a2c6c0a Ilias Tsitsimpis
        "MAIL_DIR": env.env.mail_dir,
560 ad76b118 Dimitris Aragiorgis
    }
561 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
562 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
563 215f94f4 Ilias Tsitsimpis
    try_run("mkdir -p {0}; chown root:www-data {0}; chmod 775 {0}".format(
564 215f94f4 Ilias Tsitsimpis
            env.env.mail_dir))
565 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
566 ad76b118 Dimitris Aragiorgis
567 215f94f4 Ilias Tsitsimpis
568 ad76b118 Dimitris Aragiorgis
@roles("accounts")
569 ad76b118 Dimitris Aragiorgis
def astakos_loaddata():
570 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Loading initial data to astakos...")
571 ad76b118 Dimitris Aragiorgis
    cmd = """
572 ad76b118 Dimitris Aragiorgis
    snf-manage loaddata groups
573 ad76b118 Dimitris Aragiorgis
    """
574 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
575 ad76b118 Dimitris Aragiorgis
576 ad76b118 Dimitris Aragiorgis
577 ad76b118 Dimitris Aragiorgis
@roles("accounts")
578 0fd77bd5 Dimitris Aragiorgis
def astakos_register_components():
579 b91452fa Giorgos Korfiatis
    debug(env.host, " * Register services in astakos...")
580 b91452fa Giorgos Korfiatis
581 b91452fa Giorgos Korfiatis
    cyclades_base_url = "https://%s/cyclades/" % env.env.cyclades.fqdn
582 b91452fa Giorgos Korfiatis
    pithos_base_url = "https://%s/pithos/" % env.env.pithos.fqdn
583 b91452fa Giorgos Korfiatis
    astakos_base_url = "https://%s/astakos/" % env.env.accounts.fqdn
584 b91452fa Giorgos Korfiatis
585 ad76b118 Dimitris Aragiorgis
    cmd = """
586 ad76b118 Dimitris Aragiorgis
    snf-manage component-add "home" https://{0} home-icon.png
587 b91452fa Giorgos Korfiatis
    snf-manage component-add "cyclades" {1}ui/
588 b91452fa Giorgos Korfiatis
    snf-manage component-add "pithos" {2}ui/
589 b91452fa Giorgos Korfiatis
    snf-manage component-add "astakos" {3}ui/
590 b91452fa Giorgos Korfiatis
    """.format(env.env.cms.fqdn, cyclades_base_url,
591 c0c8263a Dimitris Aragiorgis
               pithos_base_url, astakos_base_url)
592 b91452fa Giorgos Korfiatis
    try_run(cmd)
593 ad76b118 Dimitris Aragiorgis
594 ad76b118 Dimitris Aragiorgis
595 ad76b118 Dimitris Aragiorgis
@roles("accounts")
596 ad76b118 Dimitris Aragiorgis
def add_user():
597 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * adding user %s to astakos..." % env.env.user_email)
598 215f94f4 Ilias Tsitsimpis
    email = env.env.user_email
599 215f94f4 Ilias Tsitsimpis
    name = env.env.user_name
600 215f94f4 Ilias Tsitsimpis
    lastname = env.env.user_lastname
601 215f94f4 Ilias Tsitsimpis
    passwd = env.env.user_passwd
602 ad76b118 Dimitris Aragiorgis
    cmd = """
603 ad76b118 Dimitris Aragiorgis
    snf-manage user-add {0} {1} {2}
604 ad76b118 Dimitris Aragiorgis
    """.format(email, name, lastname)
605 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
606 9b69ce64 Dimitris Aragiorgis
    with settings(host_string=env.env.db.ip):
607 ad76b118 Dimitris Aragiorgis
        uid, user_auth_token, user_uuid = get_auth_token_from_db(email)
608 ad76b118 Dimitris Aragiorgis
    cmd = """
609 ad76b118 Dimitris Aragiorgis
    snf-manage user-modify --password {0} {1}
610 ad76b118 Dimitris Aragiorgis
    """.format(passwd, uid)
611 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
612 ad76b118 Dimitris Aragiorgis
613 ad76b118 Dimitris Aragiorgis
614 ad76b118 Dimitris Aragiorgis
@roles("accounts")
615 ad76b118 Dimitris Aragiorgis
def activate_user(user_email=None):
616 ad76b118 Dimitris Aragiorgis
    if not user_email:
617 215f94f4 Ilias Tsitsimpis
        user_email = env.env.user_email
618 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Activate user %s..." % user_email)
619 9b69ce64 Dimitris Aragiorgis
    with settings(host_string=env.env.db.ip):
620 ad76b118 Dimitris Aragiorgis
        uid, user_auth_token, user_uuid = get_auth_token_from_db(user_email)
621 ad76b118 Dimitris Aragiorgis
622 ad76b118 Dimitris Aragiorgis
    cmd = """
623 ad76b118 Dimitris Aragiorgis
    snf-manage user-modify --verify {0}
624 ad76b118 Dimitris Aragiorgis
    snf-manage user-modify --accept {0}
625 ad76b118 Dimitris Aragiorgis
    """.format(uid)
626 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
627 ad76b118 Dimitris Aragiorgis
628 215f94f4 Ilias Tsitsimpis
629 ad76b118 Dimitris Aragiorgis
@roles("accounts")
630 ad76b118 Dimitris Aragiorgis
def setup_astakos():
631 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up snf-astakos-app...")
632 ad76b118 Dimitris Aragiorgis
    setup_gunicorn()
633 ad76b118 Dimitris Aragiorgis
    setup_apache()
634 ad76b118 Dimitris Aragiorgis
    setup_webproject()
635 ad76b118 Dimitris Aragiorgis
    install_package("python-django-south")
636 ad76b118 Dimitris Aragiorgis
    install_package("snf-astakos-app")
637 ad76b118 Dimitris Aragiorgis
    install_package("kamaki")
638 ad76b118 Dimitris Aragiorgis
639 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/astakos.conf"
640 ad76b118 Dimitris Aragiorgis
    replace = {
641 215f94f4 Ilias Tsitsimpis
        "ACCOUNTS": env.env.accounts.fqdn,
642 215f94f4 Ilias Tsitsimpis
        "domain": env.env.domain,
643 215f94f4 Ilias Tsitsimpis
        "CYCLADES": env.env.cyclades.fqdn,
644 215f94f4 Ilias Tsitsimpis
        "PITHOS": env.env.pithos.fqdn,
645 ad76b118 Dimitris Aragiorgis
    }
646 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
647 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
648 ad76b118 Dimitris Aragiorgis
    if env.csrf_disable:
649 215f94f4 Ilias Tsitsimpis
        cmd = """
650 ad76b118 Dimitris Aragiorgis
cat <<EOF >> /etc/synnefo/astakos.conf
651 ad76b118 Dimitris Aragiorgis
try:
652 ad76b118 Dimitris Aragiorgis
  MIDDLEWARE_CLASSES.remove('django.middleware.csrf.CsrfViewMiddleware')
653 ad76b118 Dimitris Aragiorgis
except:
654 ad76b118 Dimitris Aragiorgis
  pass
655 ad76b118 Dimitris Aragiorgis
EOF
656 ad76b118 Dimitris Aragiorgis
"""
657 215f94f4 Ilias Tsitsimpis
        try_run(cmd)
658 ad76b118 Dimitris Aragiorgis
659 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
660 ad76b118 Dimitris Aragiorgis
661 ad76b118 Dimitris Aragiorgis
    cmd = """
662 ad76b118 Dimitris Aragiorgis
    snf-manage syncdb --noinput
663 ad76b118 Dimitris Aragiorgis
    snf-manage migrate im --delete-ghost-migrations
664 ad76b118 Dimitris Aragiorgis
    snf-manage migrate quotaholder_app
665 ad76b118 Dimitris Aragiorgis
    """
666 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
667 ad76b118 Dimitris Aragiorgis
668 b91452fa Giorgos Korfiatis
669 ad76b118 Dimitris Aragiorgis
@roles("accounts")
670 ad76b118 Dimitris Aragiorgis
def get_service_details(service="pithos"):
671 215f94f4 Ilias Tsitsimpis
    debug(env.host,
672 215f94f4 Ilias Tsitsimpis
          " * Getting registered details for %s service..." % service)
673 ad76b118 Dimitris Aragiorgis
    result = try_run("snf-manage component-list")
674 ad76b118 Dimitris Aragiorgis
    r = re.compile(r".*%s.*" % service, re.M)
675 ad76b118 Dimitris Aragiorgis
    service_id, _, _, service_token = r.search(result).group().split()
676 ad76b118 Dimitris Aragiorgis
    # print("%s: %s %s" % (service, service_id, service_token))
677 ad76b118 Dimitris Aragiorgis
    return (service_id, service_token)
678 ad76b118 Dimitris Aragiorgis
679 ad76b118 Dimitris Aragiorgis
680 ad76b118 Dimitris Aragiorgis
@roles("db")
681 ad76b118 Dimitris Aragiorgis
def get_auth_token_from_db(user_email=None):
682 ad76b118 Dimitris Aragiorgis
    if not user_email:
683 215f94f4 Ilias Tsitsimpis
        user_email = env.env.user_email
684 215f94f4 Ilias Tsitsimpis
    debug(env.host,
685 215f94f4 Ilias Tsitsimpis
          " * Getting authentication token and uuid for user %s..."
686 215f94f4 Ilias Tsitsimpis
          % user_email)
687 ad76b118 Dimitris Aragiorgis
    cmd = """
688 215f94f4 Ilias Tsitsimpis
echo "select id, auth_token, uuid, email from auth_user, im_astakosuser \
689 215f94f4 Ilias Tsitsimpis
where auth_user.id = im_astakosuser.user_ptr_id and auth_user.email = '{0}';" \
690 215f94f4 Ilias Tsitsimpis
> /tmp/psqlcmd
691 215f94f4 Ilias Tsitsimpis
su - postgres -c  "psql -w -d snf_apps -f /tmp/psqlcmd"
692 215f94f4 Ilias Tsitsimpis
""".format(user_email)
693 ad76b118 Dimitris Aragiorgis
694 ad76b118 Dimitris Aragiorgis
    result = try_run(cmd)
695 ad76b118 Dimitris Aragiorgis
    r = re.compile(r"(\d+)[ |]*(\S+)[ |]*(\S+)[ |]*" + user_email, re.M)
696 ad76b118 Dimitris Aragiorgis
    match = r.search(result)
697 ad76b118 Dimitris Aragiorgis
    uid, user_auth_token, user_uuid = match.groups()
698 ad76b118 Dimitris Aragiorgis
    # print("%s: %s %s %s" % ( user_email, uid, user_auth_token, user_uuid))
699 ad76b118 Dimitris Aragiorgis
700 ad76b118 Dimitris Aragiorgis
    return (uid, user_auth_token, user_uuid)
701 ad76b118 Dimitris Aragiorgis
702 ad76b118 Dimitris Aragiorgis
703 ad76b118 Dimitris Aragiorgis
@roles("cms")
704 ad76b118 Dimitris Aragiorgis
def cms_loaddata():
705 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Loading cms initial data...")
706 ad76b118 Dimitris Aragiorgis
    if env.cms_pass:
707 215f94f4 Ilias Tsitsimpis
        debug(env.host, "Aborting. Prerequisites not met.")
708 215f94f4 Ilias Tsitsimpis
        return
709 ad76b118 Dimitris Aragiorgis
    tmpl = "/tmp/sites.json"
710 ad76b118 Dimitris Aragiorgis
    replace = {}
711 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
712 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
713 ad76b118 Dimitris Aragiorgis
714 ad76b118 Dimitris Aragiorgis
    tmpl = "/tmp/page.json"
715 ad76b118 Dimitris Aragiorgis
    replace = {}
716 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
717 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
718 ad76b118 Dimitris Aragiorgis
719 ad76b118 Dimitris Aragiorgis
    cmd = """
720 ad76b118 Dimitris Aragiorgis
    snf-manage loaddata /tmp/sites.json
721 ad76b118 Dimitris Aragiorgis
    snf-manage loaddata /tmp/page.json
722 ad76b118 Dimitris Aragiorgis
    snf-manage createsuperuser --username=admin --email=admin@{0} --noinput
723 ad76b118 Dimitris Aragiorgis
    """.format(env.env.domain)
724 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
725 ad76b118 Dimitris Aragiorgis
726 ad76b118 Dimitris Aragiorgis
727 ad76b118 Dimitris Aragiorgis
@roles("cms")
728 ad76b118 Dimitris Aragiorgis
def setup_cms():
729 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up cms...")
730 ad76b118 Dimitris Aragiorgis
    if env.cms_pass:
731 215f94f4 Ilias Tsitsimpis
        debug(env.host, "Aborting. Prerequisites not met.")
732 215f94f4 Ilias Tsitsimpis
        return
733 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
734 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 accounts." + env.env.domain)
735 ad76b118 Dimitris Aragiorgis
    setup_gunicorn()
736 ad76b118 Dimitris Aragiorgis
    setup_apache()
737 ad76b118 Dimitris Aragiorgis
    setup_webproject()
738 ad76b118 Dimitris Aragiorgis
    install_package("snf-cloudcms")
739 ad76b118 Dimitris Aragiorgis
740 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/cms.conf"
741 ad76b118 Dimitris Aragiorgis
    replace = {
742 ad76b118 Dimitris Aragiorgis
        "ACCOUNTS": env.env.accounts.fqdn,
743 ad76b118 Dimitris Aragiorgis
        }
744 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
745 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
746 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
747 ad76b118 Dimitris Aragiorgis
748 ad76b118 Dimitris Aragiorgis
    cmd = """
749 ad76b118 Dimitris Aragiorgis
    snf-manage syncdb
750 ad76b118 Dimitris Aragiorgis
    snf-manage migrate --delete-ghost-migrations
751 ad76b118 Dimitris Aragiorgis
    """.format(env.env.domain)
752 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
753 ad76b118 Dimitris Aragiorgis
754 ad76b118 Dimitris Aragiorgis
755 ad76b118 Dimitris Aragiorgis
def setup_nfs_dirs():
756 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Creating NFS mount point for pithos and ganeti...")
757 ad76b118 Dimitris Aragiorgis
    cmd = """
758 ad76b118 Dimitris Aragiorgis
    mkdir -p {0}
759 ad76b118 Dimitris Aragiorgis
    cd {0}
760 ad76b118 Dimitris Aragiorgis
    mkdir -p data
761 ad76b118 Dimitris Aragiorgis
    chown www-data:www-data data
762 ad76b118 Dimitris Aragiorgis
    chmod g+ws data
763 ad76b118 Dimitris Aragiorgis
    mkdir -p /srv/okeanos
764 ad76b118 Dimitris Aragiorgis
    """.format(env.env.pithos_dir)
765 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
766 ad76b118 Dimitris Aragiorgis
767 ad76b118 Dimitris Aragiorgis
768 ad76b118 Dimitris Aragiorgis
@roles("nodes")
769 ad76b118 Dimitris Aragiorgis
def setup_nfs_clients():
770 9b69ce64 Dimitris Aragiorgis
    if env.host == env.env.pithos.ip:
771 215f94f4 Ilias Tsitsimpis
        return
772 ad76b118 Dimitris Aragiorgis
773 4baa4696 Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
774 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Mounting pithos NFS mount point...")
775 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
776 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.pithos.hostname)
777 4baa4696 Dimitris Aragiorgis
    with settings(host_string=env.env.pithos.ip):
778 4baa4696 Dimitris Aragiorgis
        update_nfs_exports(host_info.ip)
779 4baa4696 Dimitris Aragiorgis
780 ad76b118 Dimitris Aragiorgis
    install_package("nfs-common")
781 4baa4696 Dimitris Aragiorgis
    for d in [env.env.pithos_dir, env.env.image_dir]:
782 215f94f4 Ilias Tsitsimpis
        try_run("mkdir -p " + d)
783 215f94f4 Ilias Tsitsimpis
        cmd = """
784 215f94f4 Ilias Tsitsimpis
echo "{0}:{1} {1}  nfs defaults,rw,noatime,rsize=131072,\
785 215f94f4 Ilias Tsitsimpis
wsize=131072,timeo=14,intr,noacl" >> /etc/fstab
786 215f94f4 Ilias Tsitsimpis
""".format(env.env.pithos.ip, d)
787 215f94f4 Ilias Tsitsimpis
        try_run(cmd)
788 215f94f4 Ilias Tsitsimpis
        try_run("mount " + d)
789 215f94f4 Ilias Tsitsimpis
790 ad76b118 Dimitris Aragiorgis
791 ad76b118 Dimitris Aragiorgis
@roles("pithos")
792 4baa4696 Dimitris Aragiorgis
def update_nfs_exports(ip):
793 4baa4696 Dimitris Aragiorgis
    tmpl = "/tmp/exports"
794 ad76b118 Dimitris Aragiorgis
    replace = {
795 215f94f4 Ilias Tsitsimpis
        "pithos_dir": env.env.pithos_dir,
796 215f94f4 Ilias Tsitsimpis
        "image_dir": env.env.image_dir,
797 215f94f4 Ilias Tsitsimpis
        "ip": ip,
798 215f94f4 Ilias Tsitsimpis
    }
799 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
800 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
801 4baa4696 Dimitris Aragiorgis
    try_run("cat %s >> /etc/exports" % tmpl)
802 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/nfs-kernel-server restart")
803 ad76b118 Dimitris Aragiorgis
804 215f94f4 Ilias Tsitsimpis
805 4baa4696 Dimitris Aragiorgis
@roles("pithos")
806 4baa4696 Dimitris Aragiorgis
def setup_nfs_server():
807 4baa4696 Dimitris Aragiorgis
    debug(env.host, " * Setting up NFS server for pithos...")
808 4baa4696 Dimitris Aragiorgis
    setup_nfs_dirs()
809 4baa4696 Dimitris Aragiorgis
    install_package("nfs-kernel-server")
810 4baa4696 Dimitris Aragiorgis
811 ad76b118 Dimitris Aragiorgis
812 ad76b118 Dimitris Aragiorgis
@roles("pithos")
813 ad76b118 Dimitris Aragiorgis
def setup_pithos():
814 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up snf-pithos-app...")
815 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
816 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 accounts." + env.env.domain)
817 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.db.ip)
818 ad76b118 Dimitris Aragiorgis
    setup_gunicorn()
819 ad76b118 Dimitris Aragiorgis
    setup_apache()
820 ad76b118 Dimitris Aragiorgis
    setup_webproject()
821 ad76b118 Dimitris Aragiorgis
822 9b69ce64 Dimitris Aragiorgis
    with settings(host_string=env.env.accounts.ip):
823 ad76b118 Dimitris Aragiorgis
        service_id, service_token = get_service_details("pithos")
824 ad76b118 Dimitris Aragiorgis
825 ad76b118 Dimitris Aragiorgis
    install_package("kamaki")
826 ad76b118 Dimitris Aragiorgis
    install_package("snf-pithos-backend")
827 ad76b118 Dimitris Aragiorgis
    install_package("snf-pithos-app")
828 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/pithos.conf"
829 ad76b118 Dimitris Aragiorgis
    replace = {
830 ad76b118 Dimitris Aragiorgis
        "ACCOUNTS": env.env.accounts.fqdn,
831 ad76b118 Dimitris Aragiorgis
        "PITHOS": env.env.pithos.fqdn,
832 ad76b118 Dimitris Aragiorgis
        "db_node": env.env.db.ip,
833 ad76b118 Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
834 ad76b118 Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
835 ad76b118 Dimitris Aragiorgis
        "pithos_dir": env.env.pithos_dir,
836 ad76b118 Dimitris Aragiorgis
        "PITHOS_SERVICE_TOKEN": service_token,
837 ad76b118 Dimitris Aragiorgis
        "proxy": env.env.pithos.hostname == env.env.accounts.hostname
838 ad76b118 Dimitris Aragiorgis
        }
839 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
840 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
841 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
842 ad76b118 Dimitris Aragiorgis
843 ad76b118 Dimitris Aragiorgis
    install_package("snf-pithos-webclient")
844 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/webclient.conf"
845 ad76b118 Dimitris Aragiorgis
    replace = {
846 ad76b118 Dimitris Aragiorgis
        "ACCOUNTS": env.env.accounts.fqdn,
847 ad76b118 Dimitris Aragiorgis
        "PITHOS_UI_CLOUDBAR_ACTIVE_SERVICE": service_id,
848 ad76b118 Dimitris Aragiorgis
        }
849 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
850 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
851 ad76b118 Dimitris Aragiorgis
852 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
853 ad76b118 Dimitris Aragiorgis
    #TOFIX: the previous command lets pithos-backend create blocks and maps
854 ad76b118 Dimitris Aragiorgis
    #       with root owner
855 ad76b118 Dimitris Aragiorgis
    try_run("chown -R www-data:www-data %s/data " % env.env.pithos_dir)
856 ad76b118 Dimitris Aragiorgis
    #try_run("pithos-migrate stamp 4c8ccdc58192")
857 ad76b118 Dimitris Aragiorgis
    #try_run("pithos-migrate upgrade head")
858 ad76b118 Dimitris Aragiorgis
859 ad76b118 Dimitris Aragiorgis
860 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
861 ad76b118 Dimitris Aragiorgis
def setup_ganeti():
862 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up snf-ganeti...")
863 ad76b118 Dimitris Aragiorgis
    node_info = env.env.ips_info[env.host]
864 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
865 ad76b118 Dimitris Aragiorgis
        #if env.enable_lvm:
866 ad76b118 Dimitris Aragiorgis
        #    try_run("vgs " + env.env.vg)
867 ad76b118 Dimitris Aragiorgis
        try_run("getent hosts " + env.env.cluster.fqdn)
868 ad76b118 Dimitris Aragiorgis
        try_run("getent hosts %s | grep -v ^127" % env.host)
869 ad76b118 Dimitris Aragiorgis
        try_run("hostname -f | grep " + node_info.fqdn)
870 ad76b118 Dimitris Aragiorgis
        #try_run("ip link show " + env.env.common_bridge)
871 ad76b118 Dimitris Aragiorgis
        #try_run("ip link show " + env.env.common_bridge)
872 ad76b118 Dimitris Aragiorgis
        #try_run("apt-get update")
873 ad76b118 Dimitris Aragiorgis
    install_package("qemu-kvm")
874 ad76b118 Dimitris Aragiorgis
    install_package("python-bitarray")
875 ad76b118 Dimitris Aragiorgis
    install_package("ganeti-htools")
876 ad76b118 Dimitris Aragiorgis
    install_package("snf-ganeti")
877 ad76b118 Dimitris Aragiorgis
    try_run("mkdir -p /srv/ganeti/file-storage/")
878 ad76b118 Dimitris Aragiorgis
    cmd = """
879 ad76b118 Dimitris Aragiorgis
cat <<EOF > /etc/ganeti/file-storage-paths
880 ad76b118 Dimitris Aragiorgis
/srv/ganeti/file-storage
881 ad76b118 Dimitris Aragiorgis
/srv/ganeti/shared-file-storage
882 ad76b118 Dimitris Aragiorgis
EOF
883 ad76b118 Dimitris Aragiorgis
"""
884 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
885 ad76b118 Dimitris Aragiorgis
886 ad76b118 Dimitris Aragiorgis
887 ad76b118 Dimitris Aragiorgis
@roles("master")
888 ad76b118 Dimitris Aragiorgis
def add_rapi_user():
889 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Adding RAPI user to Ganeti backend...")
890 ad76b118 Dimitris Aragiorgis
    cmd = """
891 ad76b118 Dimitris Aragiorgis
    echo -n "{0}:Ganeti Remote API:{1}" | openssl md5
892 ad76b118 Dimitris Aragiorgis
    """.format(env.env.synnefo_user, env.env.synnefo_rapi_passwd)
893 ad76b118 Dimitris Aragiorgis
    result = try_run(cmd)
894 b249aba9 Christos Stavrakakis
    if result.startswith("(stdin)= "):
895 b249aba9 Christos Stavrakakis
        result = result.split("(stdin)= ")[1]
896 ad76b118 Dimitris Aragiorgis
    cmd = """
897 ad76b118 Dimitris Aragiorgis
    echo "{0} {1}{2} write" >> /var/lib/ganeti/rapi/users
898 215f94f4 Ilias Tsitsimpis
    """.format(env.env.synnefo_user, '{ha1}', result)
899 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
900 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/ganeti restart")
901 ad76b118 Dimitris Aragiorgis
902 215f94f4 Ilias Tsitsimpis
903 ad76b118 Dimitris Aragiorgis
@roles("master")
904 ad76b118 Dimitris Aragiorgis
def add_nodes():
905 ad76b118 Dimitris Aragiorgis
    nodes = env.env.cluster_nodes.split(",")
906 ad76b118 Dimitris Aragiorgis
    nodes.remove(env.env.master_node)
907 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Adding nodes to Ganeti backend...")
908 ad76b118 Dimitris Aragiorgis
    for n in nodes:
909 ad76b118 Dimitris Aragiorgis
        add_node(n)
910 ad76b118 Dimitris Aragiorgis
911 215f94f4 Ilias Tsitsimpis
912 ad76b118 Dimitris Aragiorgis
@roles("master")
913 ad76b118 Dimitris Aragiorgis
def add_node(node):
914 ad76b118 Dimitris Aragiorgis
    node_info = env.env.nodes_info[node]
915 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Adding node %s to Ganeti backend..." % node_info.fqdn)
916 215f94f4 Ilias Tsitsimpis
    cmd = "gnt-node add --no-ssh-key-check --master-capable=yes " + \
917 215f94f4 Ilias Tsitsimpis
          "--vm-capable=yes " + node_info.fqdn
918 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
919 ad76b118 Dimitris Aragiorgis
920 215f94f4 Ilias Tsitsimpis
921 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
922 ad76b118 Dimitris Aragiorgis
def enable_drbd():
923 ad76b118 Dimitris Aragiorgis
    if env.enable_drbd:
924 ad76b118 Dimitris Aragiorgis
        debug(env.host, " * Enabling DRBD...")
925 ad76b118 Dimitris Aragiorgis
        try_run("modprobe drbd minor_count=255 usermode_helper=/bin/true")
926 215f94f4 Ilias Tsitsimpis
        try_run("echo drbd minor_count=255 usermode_helper=/bin/true " +
927 215f94f4 Ilias Tsitsimpis
                ">> /etc/modules")
928 215f94f4 Ilias Tsitsimpis
929 ad76b118 Dimitris Aragiorgis
930 ad76b118 Dimitris Aragiorgis
@roles("master")
931 ad76b118 Dimitris Aragiorgis
def setup_drbd_dparams():
932 ad76b118 Dimitris Aragiorgis
    if env.enable_drbd:
933 215f94f4 Ilias Tsitsimpis
        debug(env.host,
934 215f94f4 Ilias Tsitsimpis
              " * Twicking drbd related disk parameters in Ganeti...")
935 ad76b118 Dimitris Aragiorgis
        cmd = """
936 ad76b118 Dimitris Aragiorgis
        gnt-cluster modify --disk-parameters=drbd:metavg={0}
937 ad76b118 Dimitris Aragiorgis
        gnt-group modify --disk-parameters=drbd:metavg={0} default
938 ad76b118 Dimitris Aragiorgis
        """.format(env.env.vg)
939 ad76b118 Dimitris Aragiorgis
        try_run(cmd)
940 ad76b118 Dimitris Aragiorgis
941 215f94f4 Ilias Tsitsimpis
942 ad76b118 Dimitris Aragiorgis
@roles("master")
943 ad76b118 Dimitris Aragiorgis
def enable_lvm():
944 ad76b118 Dimitris Aragiorgis
    if env.enable_lvm:
945 ad76b118 Dimitris Aragiorgis
        debug(env.host, " * Enabling LVM...")
946 ad76b118 Dimitris Aragiorgis
        cmd = """
947 ad76b118 Dimitris Aragiorgis
        gnt-cluster modify --vg-name={0}
948 ad76b118 Dimitris Aragiorgis
        """.format(env.env.vg)
949 ad76b118 Dimitris Aragiorgis
        try_run(cmd)
950 ad76b118 Dimitris Aragiorgis
    else:
951 ad76b118 Dimitris Aragiorgis
        debug(env.host, " * Disabling LVM...")
952 ad76b118 Dimitris Aragiorgis
        try_run("gnt-cluster modify --no-lvm-storage")
953 ad76b118 Dimitris Aragiorgis
954 215f94f4 Ilias Tsitsimpis
955 ad76b118 Dimitris Aragiorgis
@roles("master")
956 ad76b118 Dimitris Aragiorgis
def destroy_cluster():
957 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Destroying Ganeti cluster...")
958 ad76b118 Dimitris Aragiorgis
    #TODO: remove instances first
959 ad76b118 Dimitris Aragiorgis
    allnodes = env.env.cluster_hostnames[:]
960 ad76b118 Dimitris Aragiorgis
    allnodes.remove(env.host)
961 ad76b118 Dimitris Aragiorgis
    for n in allnodes:
962 215f94f4 Ilias Tsitsimpis
        host_info = env.env.ips_info[env.host]
963 215f94f4 Ilias Tsitsimpis
        debug(env.host, " * Removing node %s..." % n)
964 215f94f4 Ilias Tsitsimpis
        cmd = "gnt-node remove  " + host_info.fqdn
965 215f94f4 Ilias Tsitsimpis
        try_run(cmd)
966 ad76b118 Dimitris Aragiorgis
    try_run("gnt-cluster destroy --yes-do-it")
967 ad76b118 Dimitris Aragiorgis
968 ad76b118 Dimitris Aragiorgis
969 ad76b118 Dimitris Aragiorgis
@roles("master")
970 ad76b118 Dimitris Aragiorgis
def init_cluster():
971 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Initializing Ganeti backend...")
972 ad76b118 Dimitris Aragiorgis
    # extra = ""
973 ad76b118 Dimitris Aragiorgis
    # if env.enable_lvm:
974 ad76b118 Dimitris Aragiorgis
    #     extra += " --vg-name={0} ".format(env.env.vg)
975 ad76b118 Dimitris Aragiorgis
    # else:
976 ad76b118 Dimitris Aragiorgis
    #     extra += " --no-lvm-storage "
977 ad76b118 Dimitris Aragiorgis
    # if not env.enable_drbd:
978 ad76b118 Dimitris Aragiorgis
    #     extra += " --no-drbd-storage "
979 ad76b118 Dimitris Aragiorgis
    extra = " --no-lvm-storage --no-drbd-storage "
980 ad76b118 Dimitris Aragiorgis
    cmd = """
981 ad76b118 Dimitris Aragiorgis
    gnt-cluster init --enabled-hypervisors=kvm \
982 215f94f4 Ilias Tsitsimpis
        {0} \
983 215f94f4 Ilias Tsitsimpis
        --nic-parameters link={1},mode=bridged \
984 215f94f4 Ilias Tsitsimpis
        --master-netdev {2} \
985 215f94f4 Ilias Tsitsimpis
        --default-iallocator hail \
986 215f94f4 Ilias Tsitsimpis
        --hypervisor-parameters kvm:kernel_path=,vnc_bind_address=0.0.0.0 \
987 215f94f4 Ilias Tsitsimpis
        --no-ssh-init --no-etc-hosts \
988 215f94f4 Ilias Tsitsimpis
        {3}
989 ad76b118 Dimitris Aragiorgis
    """.format(extra, env.env.common_bridge,
990 ad76b118 Dimitris Aragiorgis
               env.env.cluster_netdev, env.env.cluster.fqdn)
991 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
992 ad76b118 Dimitris Aragiorgis
993 ad76b118 Dimitris Aragiorgis
994 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
995 ad76b118 Dimitris Aragiorgis
def debootstrap():
996 ad76b118 Dimitris Aragiorgis
    install_package("ganeti-instance-debootstrap")
997 ad76b118 Dimitris Aragiorgis
998 ad76b118 Dimitris Aragiorgis
999 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
1000 ad76b118 Dimitris Aragiorgis
def setup_image_host():
1001 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up snf-image...")
1002 ad76b118 Dimitris Aragiorgis
    install_package("snf-pithos-backend")
1003 ad76b118 Dimitris Aragiorgis
    install_package("snf-image")
1004 4baa4696 Dimitris Aragiorgis
    try_run("mkdir -p %s" % env.env.image_dir)
1005 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/default/snf-image"
1006 ad76b118 Dimitris Aragiorgis
    replace = {
1007 ad76b118 Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
1008 ad76b118 Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
1009 ad76b118 Dimitris Aragiorgis
        "pithos_dir": env.env.pithos_dir,
1010 ad76b118 Dimitris Aragiorgis
        "db_node": env.env.db.ip,
1011 ad76b118 Dimitris Aragiorgis
    }
1012 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
1013 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
1014 ad76b118 Dimitris Aragiorgis
1015 ad76b118 Dimitris Aragiorgis
1016 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
1017 ad76b118 Dimitris Aragiorgis
def setup_image_helper():
1018 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Updating helper image...")
1019 ad76b118 Dimitris Aragiorgis
    cmd = """
1020 ad76b118 Dimitris Aragiorgis
    snf-image-update-helper -y
1021 ad76b118 Dimitris Aragiorgis
    """
1022 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1023 ad76b118 Dimitris Aragiorgis
1024 ad76b118 Dimitris Aragiorgis
1025 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
1026 ad76b118 Dimitris Aragiorgis
def setup_gtools():
1027 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up snf-cyclades-gtools...")
1028 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
1029 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.mq.ip)
1030 ad76b118 Dimitris Aragiorgis
    setup_common()
1031 ad76b118 Dimitris Aragiorgis
    install_package("snf-cyclades-gtools")
1032 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/gtools.conf"
1033 ad76b118 Dimitris Aragiorgis
    replace = {
1034 ad76b118 Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
1035 ad76b118 Dimitris Aragiorgis
        "synnefo_rabbitmq_passwd": env.env.synnefo_rabbitmq_passwd,
1036 ad76b118 Dimitris Aragiorgis
        "mq_node": env.env.mq.ip,
1037 ad76b118 Dimitris Aragiorgis
    }
1038 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
1039 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
1040 ad76b118 Dimitris Aragiorgis
1041 ad76b118 Dimitris Aragiorgis
    cmd = """
1042 ad76b118 Dimitris Aragiorgis
    sed -i 's/false/true/' /etc/default/snf-ganeti-eventd
1043 ad76b118 Dimitris Aragiorgis
    /etc/init.d/snf-ganeti-eventd start
1044 ad76b118 Dimitris Aragiorgis
    """
1045 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1046 ad76b118 Dimitris Aragiorgis
1047 ad76b118 Dimitris Aragiorgis
1048 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
1049 ad76b118 Dimitris Aragiorgis
def setup_iptables():
1050 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up iptables to mangle DHCP requests...")
1051 ad76b118 Dimitris Aragiorgis
    cmd = """
1052 215f94f4 Ilias Tsitsimpis
    iptables -t mangle -A PREROUTING -i br+ -p udp -m udp --dport 67 \
1053 215f94f4 Ilias Tsitsimpis
            -j NFQUEUE --queue-num 42
1054 215f94f4 Ilias Tsitsimpis
    iptables -t mangle -A PREROUTING -i tap+ -p udp -m udp --dport 67 \
1055 215f94f4 Ilias Tsitsimpis
            -j NFQUEUE --queue-num 42
1056 215f94f4 Ilias Tsitsimpis
    iptables -t mangle -A PREROUTING -i prv+ -p udp -m udp --dport 67 \
1057 215f94f4 Ilias Tsitsimpis
            -j NFQUEUE --queue-num 42
1058 215f94f4 Ilias Tsitsimpis

1059 215f94f4 Ilias Tsitsimpis
    ip6tables -t mangle -A PREROUTING -i br+ -p ipv6-icmp -m icmp6 \
1060 215f94f4 Ilias Tsitsimpis
            --icmpv6-type 133 -j NFQUEUE --queue-num 43
1061 215f94f4 Ilias Tsitsimpis
    ip6tables -t mangle -A PREROUTING -i br+ -p ipv6-icmp -m icmp6 \
1062 215f94f4 Ilias Tsitsimpis
            --icmpv6-type 135 -j NFQUEUE --queue-num 44
1063 ad76b118 Dimitris Aragiorgis
    """
1064 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1065 ad76b118 Dimitris Aragiorgis
1066 215f94f4 Ilias Tsitsimpis
1067 ad76b118 Dimitris Aragiorgis
@roles("ganeti")
1068 ad76b118 Dimitris Aragiorgis
def setup_network():
1069 215f94f4 Ilias Tsitsimpis
    debug(env.host,
1070 215f94f4 Ilias Tsitsimpis
          "Setting up networking for Ganeti instances (nfdhcpd, etc.)...")
1071 ad76b118 Dimitris Aragiorgis
    install_package("nfqueue-bindings-python")
1072 ad76b118 Dimitris Aragiorgis
    install_package("nfdhcpd")
1073 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/nfdhcpd/nfdhcpd.conf"
1074 ad76b118 Dimitris Aragiorgis
    replace = {
1075 215f94f4 Ilias Tsitsimpis
        "ns_node_ip": env.env.ns.ip
1076 215f94f4 Ilias Tsitsimpis
    }
1077 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
1078 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl)
1079 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/nfdhcpd restart")
1080 ad76b118 Dimitris Aragiorgis
1081 ad76b118 Dimitris Aragiorgis
    install_package("snf-network")
1082 ad76b118 Dimitris Aragiorgis
    cmd = """
1083 215f94f4 Ilias Tsitsimpis
sed -i 's/MAC_MASK.*/MAC_MASK = ff:ff:f0:00:00:00/' /etc/default/snf-network
1084 ad76b118 Dimitris Aragiorgis
    """
1085 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1086 ad76b118 Dimitris Aragiorgis
1087 ad76b118 Dimitris Aragiorgis
1088 ad76b118 Dimitris Aragiorgis
@roles("router")
1089 ad76b118 Dimitris Aragiorgis
def setup_router():
1090 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up internal router for NAT...")
1091 ad76b118 Dimitris Aragiorgis
    cmd = """
1092 ad76b118 Dimitris Aragiorgis
    echo 1 > /proc/sys/net/ipv4/ip_forward
1093 ad76b118 Dimitris Aragiorgis
    iptables -t nat -A POSTROUTING -s {0} -o {3} -j MASQUERADE
1094 ad76b118 Dimitris Aragiorgis
    ip addr add {1} dev {2}
1095 ad76b118 Dimitris Aragiorgis
    ip route add {0} dev {2} src {1}
1096 ad76b118 Dimitris Aragiorgis
    """.format(env.env.synnefo_public_network_subnet,
1097 ad76b118 Dimitris Aragiorgis
               env.env.synnefo_public_network_gateway,
1098 ad76b118 Dimitris Aragiorgis
               env.env.common_bridge, env.env.public_iface)
1099 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1100 ad76b118 Dimitris Aragiorgis
1101 1f471540 Dionysis Grigoropoulos
1102 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1103 ad76b118 Dimitris Aragiorgis
def cyclades_loaddata():
1104 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Loading initial data for cyclades...")
1105 1f471540 Dionysis Grigoropoulos
    try_run("snf-manage flavor-create %s %s %s %s" % (env.env.flavor_cpu,
1106 1f471540 Dionysis Grigoropoulos
                                                      env.env.flavor_ram,
1107 1f471540 Dionysis Grigoropoulos
                                                      env.env.flavor_disk,
1108 1f471540 Dionysis Grigoropoulos
                                                      env.env.flavor_storage))
1109 ad76b118 Dimitris Aragiorgis
    #run("snf-manage loaddata flavors")
1110 ad76b118 Dimitris Aragiorgis
1111 ad76b118 Dimitris Aragiorgis
1112 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1113 ad76b118 Dimitris Aragiorgis
def setup_cyclades():
1114 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up snf-cyclades-app...")
1115 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
1116 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 accounts." + env.env.domain)
1117 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.db.ip)
1118 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.mq.ip)
1119 ad76b118 Dimitris Aragiorgis
    setup_gunicorn()
1120 ad76b118 Dimitris Aragiorgis
    setup_apache()
1121 ad76b118 Dimitris Aragiorgis
    setup_webproject()
1122 ad76b118 Dimitris Aragiorgis
    install_package("memcached")
1123 ad76b118 Dimitris Aragiorgis
    install_package("python-memcache")
1124 ad76b118 Dimitris Aragiorgis
    install_package("snf-pithos-backend")
1125 ad76b118 Dimitris Aragiorgis
    install_package("kamaki")
1126 ad76b118 Dimitris Aragiorgis
    install_package("snf-cyclades-app")
1127 ad76b118 Dimitris Aragiorgis
    install_package("python-django-south")
1128 ad76b118 Dimitris Aragiorgis
    tmpl = "/etc/synnefo/cyclades.conf"
1129 ad76b118 Dimitris Aragiorgis
1130 9b69ce64 Dimitris Aragiorgis
    with settings(host_string=env.env.accounts.ip):
1131 ad76b118 Dimitris Aragiorgis
        service_id, service_token = get_service_details("cyclades")
1132 ad76b118 Dimitris Aragiorgis
1133 ad76b118 Dimitris Aragiorgis
    replace = {
1134 ad76b118 Dimitris Aragiorgis
        "ACCOUNTS": env.env.accounts.fqdn,
1135 ad76b118 Dimitris Aragiorgis
        "CYCLADES": env.env.cyclades.fqdn,
1136 ad76b118 Dimitris Aragiorgis
        "mq_node": env.env.mq.ip,
1137 ad76b118 Dimitris Aragiorgis
        "db_node": env.env.db.ip,
1138 ad76b118 Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
1139 ad76b118 Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
1140 ad76b118 Dimitris Aragiorgis
        "synnefo_rabbitmq_passwd": env.env.synnefo_rabbitmq_passwd,
1141 ad76b118 Dimitris Aragiorgis
        "pithos_dir": env.env.pithos_dir,
1142 ad76b118 Dimitris Aragiorgis
        "common_bridge": env.env.common_bridge,
1143 ad76b118 Dimitris Aragiorgis
        "HOST": env.env.cyclades.ip,
1144 ad76b118 Dimitris Aragiorgis
        "domain": env.env.domain,
1145 ad76b118 Dimitris Aragiorgis
        "CYCLADES_SERVICE_TOKEN": service_token,
1146 ad76b118 Dimitris Aragiorgis
        "proxy": env.env.cyclades.hostname == env.env.accounts.hostname
1147 ad76b118 Dimitris Aragiorgis
        }
1148 ad76b118 Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
1149 ad76b118 Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
1150 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
1151 ad76b118 Dimitris Aragiorgis
1152 ad76b118 Dimitris Aragiorgis
    cmd = """
1153 ad76b118 Dimitris Aragiorgis
    sed -i 's/false/true/' /etc/default/snf-dispatcher
1154 ad76b118 Dimitris Aragiorgis
    /etc/init.d/snf-dispatcher start
1155 ad76b118 Dimitris Aragiorgis
    """
1156 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1157 ad76b118 Dimitris Aragiorgis
1158 ad76b118 Dimitris Aragiorgis
    try_run("snf-manage syncdb")
1159 ad76b118 Dimitris Aragiorgis
    try_run("snf-manage migrate --delete-ghost-migrations")
1160 ad76b118 Dimitris Aragiorgis
1161 ad76b118 Dimitris Aragiorgis
1162 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1163 ad76b118 Dimitris Aragiorgis
def get_backend_id(cluster_name="ganeti1.synnefo.deploy.local"):
1164 215f94f4 Ilias Tsitsimpis
    backend_id = try_run("snf-manage backend-list 2>/dev/null " +
1165 215f94f4 Ilias Tsitsimpis
                         "| grep %s | awk '{print $1}'" % cluster_name)
1166 ad76b118 Dimitris Aragiorgis
    return backend_id
1167 ad76b118 Dimitris Aragiorgis
1168 ad76b118 Dimitris Aragiorgis
1169 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1170 ad76b118 Dimitris Aragiorgis
def add_backend():
1171 215f94f4 Ilias Tsitsimpis
    debug(env.host,
1172 215f94f4 Ilias Tsitsimpis
          "adding %s ganeti backend to cyclades..." % env.env.cluster.fqdn)
1173 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
1174 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.cluster.fqdn)
1175 ad76b118 Dimitris Aragiorgis
    cmd = """
1176 ad76b118 Dimitris Aragiorgis
    snf-manage backend-add --clustername={0} --user={1} --pass={2}
1177 ad76b118 Dimitris Aragiorgis
    """.format(env.env.cluster.fqdn, env.env.synnefo_user,
1178 ad76b118 Dimitris Aragiorgis
               env.env.synnefo_rapi_passwd)
1179 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1180 ad76b118 Dimitris Aragiorgis
    backend_id = get_backend_id(env.env.cluster.fqdn)
1181 ad76b118 Dimitris Aragiorgis
    try_run("snf-manage backend-modify --drained=False " + backend_id)
1182 ad76b118 Dimitris Aragiorgis
1183 215f94f4 Ilias Tsitsimpis
1184 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1185 ad76b118 Dimitris Aragiorgis
def pin_user_to_backend(user_email):
1186 ad76b118 Dimitris Aragiorgis
    backend_id = get_backend_id(env.env.cluster.fqdn)
1187 ad76b118 Dimitris Aragiorgis
    # pin user to backend
1188 ad76b118 Dimitris Aragiorgis
    cmd = """
1189 ad76b118 Dimitris Aragiorgis
cat <<EOF >> /etc/synnefo/cyclades.conf
1190 ad76b118 Dimitris Aragiorgis

1191 ad76b118 Dimitris Aragiorgis
BACKEND_PER_USER = {
1192 215f94f4 Ilias Tsitsimpis
  '{0}': {1},
1193 ad76b118 Dimitris Aragiorgis
}
1194 ad76b118 Dimitris Aragiorgis

1195 ad76b118 Dimitris Aragiorgis
EOF
1196 ad76b118 Dimitris Aragiorgis
/etc/init.d/gunicorn restart
1197 215f94f4 Ilias Tsitsimpis
""".format(user_email, backend_id)
1198 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1199 ad76b118 Dimitris Aragiorgis
1200 215f94f4 Ilias Tsitsimpis
1201 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1202 ad76b118 Dimitris Aragiorgis
def add_pools():
1203 215f94f4 Ilias Tsitsimpis
    debug(env.host,
1204 215f94f4 Ilias Tsitsimpis
          " * Creating pools of resources (brigdes, mac prefixes) " +
1205 215f94f4 Ilias Tsitsimpis
          "in cyclades...")
1206 215f94f4 Ilias Tsitsimpis
    try_run("snf-manage pool-create --type=mac-prefix " +
1207 215f94f4 Ilias Tsitsimpis
            "--base=aa:00:0 --size=65536")
1208 ad76b118 Dimitris Aragiorgis
    try_run("snf-manage pool-create --type=bridge --base=prv --size=20")
1209 ad76b118 Dimitris Aragiorgis
1210 ad76b118 Dimitris Aragiorgis
1211 b29b8213 Christos Stavrakakis
@roles("accounts", "cyclades", "pithos")
1212 b29b8213 Christos Stavrakakis
def export_services():
1213 b29b8213 Christos Stavrakakis
    debug(env.host, " * Exporting services...")
1214 b29b8213 Christos Stavrakakis
    host = env.host
1215 b29b8213 Christos Stavrakakis
    services = []
1216 b29b8213 Christos Stavrakakis
    if host == env.env.cyclades.ip:
1217 b29b8213 Christos Stavrakakis
        services.append("cyclades")
1218 b29b8213 Christos Stavrakakis
    if host == env.env.pithos.ip:
1219 b29b8213 Christos Stavrakakis
        services.append("pithos")
1220 b29b8213 Christos Stavrakakis
    if host == env.env.accounts.ip:
1221 b29b8213 Christos Stavrakakis
        services.append("astakos")
1222 b29b8213 Christos Stavrakakis
    for service in services:
1223 b29b8213 Christos Stavrakakis
        filename = "%s_services.json" % service
1224 b29b8213 Christos Stavrakakis
        cmd = "snf-manage service-export-%s > %s" % (service, filename)
1225 b29b8213 Christos Stavrakakis
        run(cmd)
1226 b29b8213 Christos Stavrakakis
        get(filename, filename+".local")
1227 b29b8213 Christos Stavrakakis
1228 b29b8213 Christos Stavrakakis
1229 b29b8213 Christos Stavrakakis
@roles("accounts")
1230 b29b8213 Christos Stavrakakis
def import_services():
1231 b29b8213 Christos Stavrakakis
    debug(env.host, " * Registering services to astakos...")
1232 b29b8213 Christos Stavrakakis
    for service in ["cyclades", "pithos", "astakos"]:
1233 b29b8213 Christos Stavrakakis
        filename = "%s_services.json" % service
1234 215f94f4 Ilias Tsitsimpis
        put(filename + ".local", filename)
1235 b29b8213 Christos Stavrakakis
        cmd = "snf-manage service-import --json=%s" % filename
1236 b29b8213 Christos Stavrakakis
        run(cmd)
1237 b29b8213 Christos Stavrakakis
1238 b29b8213 Christos Stavrakakis
    debug(env.host, " * Setting default quota...")
1239 b29b8213 Christos Stavrakakis
    cmd = """
1240 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 40G pithos.diskspace
1241 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 2 astakos.pending_app
1242 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 4 cyclades.vm
1243 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 40G cyclades.disk
1244 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 16G cyclades.ram
1245 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 8G cyclades.active_ram
1246 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 32 cyclades.cpu
1247 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 16 cyclades.active_cpu
1248 b29b8213 Christos Stavrakakis
    snf-manage resource-modify --limit 4 cyclades.network.private
1249 b29b8213 Christos Stavrakakis
    """
1250 b29b8213 Christos Stavrakakis
    try_run(cmd)
1251 b29b8213 Christos Stavrakakis
1252 b29b8213 Christos Stavrakakis
1253 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1254 ad76b118 Dimitris Aragiorgis
def add_network():
1255 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Adding public network in cyclades...")
1256 ad76b118 Dimitris Aragiorgis
    backend_id = get_backend_id(env.env.cluster.fqdn)
1257 ad76b118 Dimitris Aragiorgis
    cmd = """
1258 215f94f4 Ilias Tsitsimpis
    snf-manage network-create --subnet={0} --gateway={1} \
1259 215f94f4 Ilias Tsitsimpis
            --public --dhcp --flavor={2} --mode=bridged --link={3} \
1260 215f94f4 Ilias Tsitsimpis
            --name=Internet --backend-id={4}
1261 ad76b118 Dimitris Aragiorgis
    """.format(env.env.synnefo_public_network_subnet,
1262 ad76b118 Dimitris Aragiorgis
               env.env.synnefo_public_network_gateway,
1263 ad76b118 Dimitris Aragiorgis
               env.env.synnefo_public_network_type,
1264 ad76b118 Dimitris Aragiorgis
               env.env.common_bridge, backend_id)
1265 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1266 ad76b118 Dimitris Aragiorgis
1267 ad76b118 Dimitris Aragiorgis
1268 ad76b118 Dimitris Aragiorgis
@roles("cyclades")
1269 ad76b118 Dimitris Aragiorgis
def setup_vncauthproxy():
1270 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Setting up vncauthproxy...")
1271 ad76b118 Dimitris Aragiorgis
    install_package("snf-vncauthproxy")
1272 ad76b118 Dimitris Aragiorgis
    cmd = """
1273 ad76b118 Dimitris Aragiorgis
    echo CHUID="www-data:nogroup" >> /etc/default/vncauthproxy
1274 ad76b118 Dimitris Aragiorgis
    rm /var/log/vncauthproxy/vncauthproxy.log
1275 ad76b118 Dimitris Aragiorgis
    """
1276 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1277 ad76b118 Dimitris Aragiorgis
    try_run("/etc/init.d/vncauthproxy restart")
1278 ad76b118 Dimitris Aragiorgis
1279 215f94f4 Ilias Tsitsimpis
1280 ad76b118 Dimitris Aragiorgis
@roles("client")
1281 ad76b118 Dimitris Aragiorgis
def setup_kamaki():
1282 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up kamaki client...")
1283 ad76b118 Dimitris Aragiorgis
    with settings(hide("everything")):
1284 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 accounts." + env.env.domain)
1285 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 cyclades." + env.env.domain)
1286 ad76b118 Dimitris Aragiorgis
        try_run("ping -c1 pithos." + env.env.domain)
1287 ad76b118 Dimitris Aragiorgis
1288 9b69ce64 Dimitris Aragiorgis
    with settings(host_string=env.env.db.ip):
1289 215f94f4 Ilias Tsitsimpis
        uid, user_auth_token, user_uuid = \
1290 215f94f4 Ilias Tsitsimpis
            get_auth_token_from_db(env.env.user_email)
1291 ad76b118 Dimitris Aragiorgis
1292 ad76b118 Dimitris Aragiorgis
    install_package("python-progress")
1293 ad76b118 Dimitris Aragiorgis
    install_package("kamaki")
1294 ad76b118 Dimitris Aragiorgis
    cmd = """
1295 ad76b118 Dimitris Aragiorgis
    kamaki config set cloud.default.url "https://{0}/astakos/identity/v2.0/"
1296 ad76b118 Dimitris Aragiorgis
    kamaki config set cloud.default.token {1}
1297 ad76b118 Dimitris Aragiorgis
    """.format(env.env.accounts.fqdn, user_auth_token)
1298 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1299 ad76b118 Dimitris Aragiorgis
    try_run("kamaki file create images")
1300 ad76b118 Dimitris Aragiorgis
1301 215f94f4 Ilias Tsitsimpis
1302 ad76b118 Dimitris Aragiorgis
@roles("client")
1303 ad76b118 Dimitris Aragiorgis
def upload_image(image="debian_base.diskdump"):
1304 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Uploading initial image to pithos...")
1305 ad76b118 Dimitris Aragiorgis
    image = "debian_base.diskdump"
1306 ad76b118 Dimitris Aragiorgis
    try_run("wget {0} -O /tmp/{1}".format(env.env.debian_base_url, image))
1307 ad76b118 Dimitris Aragiorgis
    try_run("kamaki file upload --container images /tmp/{0} {0}".format(image))
1308 ad76b118 Dimitris Aragiorgis
1309 215f94f4 Ilias Tsitsimpis
1310 ad76b118 Dimitris Aragiorgis
@roles("client")
1311 ad76b118 Dimitris Aragiorgis
def register_image(image="debian_base.diskdump"):
1312 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Register image to plankton...")
1313 0fd77bd5 Dimitris Aragiorgis
    # with settings(host_string=env.env.db.ip):
1314 215f94f4 Ilias Tsitsimpis
    #     uid, user_auth_token, user_uuid = \
1315 215f94f4 Ilias Tsitsimpis
    #        get_auth_token_from_db(env.env.user_email)
1316 ad76b118 Dimitris Aragiorgis
1317 24aebd56 Ilias Tsitsimpis
    image_location = "images:{0}".format(image)
1318 ad76b118 Dimitris Aragiorgis
    cmd = """
1319 ad76b118 Dimitris Aragiorgis
    sleep 5
1320 215f94f4 Ilias Tsitsimpis
    kamaki image register "Debian Base" {0} --public --disk-format=diskdump \
1321 215f94f4 Ilias Tsitsimpis
            --property OSFAMILY=linux --property ROOT_PARTITION=1 \
1322 215f94f4 Ilias Tsitsimpis
            --property description="Debian Squeeze Base System" \
1323 215f94f4 Ilias Tsitsimpis
            --property size=450M --property kernel=2.6.32 \
1324 215f94f4 Ilias Tsitsimpis
            --property GUI="No GUI" --property sortorder=1 \
1325 215f94f4 Ilias Tsitsimpis
            --property USERS=root --property OS=debian
1326 24aebd56 Ilias Tsitsimpis
    """.format(image_location)
1327 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1328 ad76b118 Dimitris Aragiorgis
1329 215f94f4 Ilias Tsitsimpis
1330 ad76b118 Dimitris Aragiorgis
@roles("client")
1331 ad76b118 Dimitris Aragiorgis
def setup_burnin():
1332 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Setting up burnin testing tool...")
1333 ad76b118 Dimitris Aragiorgis
    install_package("kamaki")
1334 ad76b118 Dimitris Aragiorgis
    install_package("snf-tools")
1335 ad76b118 Dimitris Aragiorgis
1336 215f94f4 Ilias Tsitsimpis
1337 ad76b118 Dimitris Aragiorgis
@roles("pithos")
1338 ad76b118 Dimitris Aragiorgis
def add_image_locally():
1339 215f94f4 Ilias Tsitsimpis
    debug(env.host,
1340 215f94f4 Ilias Tsitsimpis
          " * Getting image locally in order snf-image to use it directly..")
1341 ad76b118 Dimitris Aragiorgis
    image = "debian_base.diskdump"
1342 215f94f4 Ilias Tsitsimpis
    try_run("wget {0} -O {1}/{2}".format(
1343 215f94f4 Ilias Tsitsimpis
            env.env.debian_base_url, env.env.image_dir, image))
1344 ad76b118 Dimitris Aragiorgis
1345 ad76b118 Dimitris Aragiorgis
1346 ad76b118 Dimitris Aragiorgis
@roles("master")
1347 ad76b118 Dimitris Aragiorgis
def gnt_instance_add(name="test"):
1348 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Adding test instance to Ganeti...")
1349 215f94f4 Ilias Tsitsimpis
    osp = """img_passwd=gamwtosecurity,\
1350 215f94f4 Ilias Tsitsimpis
img_format=diskdump,img_id=debian_base,\
1351 215f94f4 Ilias Tsitsimpis
img_properties='{"OSFAMILY":"linux"\,"ROOT_PARTITION":"1"}'"""
1352 ad76b118 Dimitris Aragiorgis
    cmd = """
1353 215f94f4 Ilias Tsitsimpis
    gnt-instance add  -o snf-image+default --os-parameters {0} \
1354 215f94f4 Ilias Tsitsimpis
            -t plain --disk 0:size=1G --no-name-check --no-ip-check \
1355 215f94f4 Ilias Tsitsimpis
            --net 0:ip=pool,network=test --no-install \
1356 215f94f4 Ilias Tsitsimpis
            --hypervisor-parameters kvm:machine_version=pc-1.0 {1}
1357 ad76b118 Dimitris Aragiorgis
    """.format(osp, name)
1358 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1359 ad76b118 Dimitris Aragiorgis
1360 215f94f4 Ilias Tsitsimpis
1361 ad76b118 Dimitris Aragiorgis
@roles("master")
1362 215f94f4 Ilias Tsitsimpis
def gnt_network_add(name="test", subnet="10.0.0.0/26", gw="10.0.0.1",
1363 215f94f4 Ilias Tsitsimpis
                    mode="bridged", link="br0"):
1364 ad76b118 Dimitris Aragiorgis
    debug(env.host, " * Adding test network to Ganeti...")
1365 ad76b118 Dimitris Aragiorgis
    cmd = """
1366 ad76b118 Dimitris Aragiorgis
    gnt-network add --network={1} --gateway={2} {0}
1367 ad76b118 Dimitris Aragiorgis
    gnt-network connect {0} {3} {4}
1368 ad76b118 Dimitris Aragiorgis
    """.format(name, subnet, gw, mode, link)
1369 ad76b118 Dimitris Aragiorgis
    try_run(cmd)
1370 ad76b118 Dimitris Aragiorgis
1371 215f94f4 Ilias Tsitsimpis
1372 ad76b118 Dimitris Aragiorgis
@roles("ips")
1373 ad76b118 Dimitris Aragiorgis
def test():
1374 ad76b118 Dimitris Aragiorgis
    debug(env.host, "Testing...")
1375 ad76b118 Dimitris Aragiorgis
    try_run("hostname && date")