Statistics
| Branch: | Tag: | Revision:

root / snf-deploy / fabfile.py @ 23f46a1b

History | View | Annotate | Download (42.1 kB)

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

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

311 28991d59 Ilias Tsitsimpis

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

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

1217 0ac84a9a Dimitris Aragiorgis
BACKEND_PER_USER = {
1218 f1800130 Ilias Tsitsimpis
  '{0}': {1},
1219 0ac84a9a Dimitris Aragiorgis
}
1220 0ac84a9a Dimitris Aragiorgis

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