Statistics
| Branch: | Tag: | Revision:

root / snf-deploy / fabfile.py @ fde2c1f7

History | View | Annotate | Download (41.8 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 0ac84a9a Dimitris Aragiorgis
1016 0ac84a9a Dimitris Aragiorgis
1017 0ac84a9a Dimitris Aragiorgis
@roles("ganeti")
1018 0ac84a9a Dimitris Aragiorgis
def debootstrap():
1019 0ac84a9a Dimitris Aragiorgis
    install_package("ganeti-instance-debootstrap")
1020 0ac84a9a Dimitris Aragiorgis
1021 0ac84a9a Dimitris Aragiorgis
1022 0ac84a9a Dimitris Aragiorgis
@roles("ganeti")
1023 0ac84a9a Dimitris Aragiorgis
def setup_image_host():
1024 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Setting up snf-image...")
1025 0ac84a9a Dimitris Aragiorgis
    install_package("snf-pithos-backend")
1026 0ac84a9a Dimitris Aragiorgis
    install_package("snf-image")
1027 9f93a6fb Dimitris Aragiorgis
    try_run("mkdir -p %s" % env.env.image_dir)
1028 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/default/snf-image"
1029 0ac84a9a Dimitris Aragiorgis
    replace = {
1030 0ac84a9a Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
1031 0ac84a9a Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
1032 0ac84a9a Dimitris Aragiorgis
        "pithos_dir": env.env.pithos_dir,
1033 0ac84a9a Dimitris Aragiorgis
        "db_node": env.env.db.ip,
1034 093d25d8 Dimitris Aragiorgis
        "image_dir": env.env.image_dir,
1035 0ac84a9a Dimitris Aragiorgis
    }
1036 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
1037 0e6e73d3 Ilias Tsitsimpis
    try_put(custom, tmpl)
1038 0ac84a9a Dimitris Aragiorgis
1039 0ac84a9a Dimitris Aragiorgis
1040 0ac84a9a Dimitris Aragiorgis
@roles("ganeti")
1041 0ac84a9a Dimitris Aragiorgis
def setup_image_helper():
1042 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Updating helper image...")
1043 0ac84a9a Dimitris Aragiorgis
    cmd = """
1044 0ac84a9a Dimitris Aragiorgis
    snf-image-update-helper -y
1045 0ac84a9a Dimitris Aragiorgis
    """
1046 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
1047 0ac84a9a Dimitris Aragiorgis
1048 0ac84a9a Dimitris Aragiorgis
1049 0ac84a9a Dimitris Aragiorgis
@roles("ganeti")
1050 0ac84a9a Dimitris Aragiorgis
def setup_gtools():
1051 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Setting up snf-cyclades-gtools...")
1052 0ac84a9a Dimitris Aragiorgis
    with settings(hide("everything")):
1053 0ac84a9a Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.mq.ip)
1054 0ac84a9a Dimitris Aragiorgis
    setup_common()
1055 0ac84a9a Dimitris Aragiorgis
    install_package("snf-cyclades-gtools")
1056 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/synnefo/gtools.conf"
1057 0ac84a9a Dimitris Aragiorgis
    replace = {
1058 0ac84a9a Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
1059 0ac84a9a Dimitris Aragiorgis
        "synnefo_rabbitmq_passwd": env.env.synnefo_rabbitmq_passwd,
1060 0ac84a9a Dimitris Aragiorgis
        "mq_node": env.env.mq.ip,
1061 0ac84a9a Dimitris Aragiorgis
    }
1062 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
1063 0e6e73d3 Ilias Tsitsimpis
    try_put(custom, tmpl)
1064 0ac84a9a Dimitris Aragiorgis
1065 0ac84a9a Dimitris Aragiorgis
    cmd = """
1066 0ac84a9a Dimitris Aragiorgis
    sed -i 's/false/true/' /etc/default/snf-ganeti-eventd
1067 0ac84a9a Dimitris Aragiorgis
    /etc/init.d/snf-ganeti-eventd start
1068 0ac84a9a Dimitris Aragiorgis
    """
1069 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
1070 0ac84a9a Dimitris Aragiorgis
1071 0ac84a9a Dimitris Aragiorgis
1072 0ac84a9a Dimitris Aragiorgis
@roles("ganeti")
1073 0ac84a9a Dimitris Aragiorgis
def setup_iptables():
1074 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Setting up iptables to mangle DHCP requests...")
1075 0ac84a9a Dimitris Aragiorgis
    cmd = """
1076 f1800130 Ilias Tsitsimpis
    iptables -t mangle -A PREROUTING -i br+ -p udp -m udp --dport 67 \
1077 f1800130 Ilias Tsitsimpis
            -j NFQUEUE --queue-num 42
1078 f1800130 Ilias Tsitsimpis
    iptables -t mangle -A PREROUTING -i tap+ -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 prv+ -p udp -m udp --dport 67 \
1081 f1800130 Ilias Tsitsimpis
            -j NFQUEUE --queue-num 42
1082 f1800130 Ilias Tsitsimpis

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

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

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