Statistics
| Branch: | Tag: | Revision:

root / snf-deploy / fabfile.py @ 7aa13555

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

311 9772cb94 Ilias Tsitsimpis

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

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

1216 ad76b118 Dimitris Aragiorgis
BACKEND_PER_USER = {
1217 215f94f4 Ilias Tsitsimpis
  '{0}': {1},
1218 ad76b118 Dimitris Aragiorgis
}
1219 ad76b118 Dimitris Aragiorgis

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