Statistics
| Branch: | Tag: | Revision:

root / snf-deploy / snfdeploy / fabfile.py @ 9f41ab1e

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

304 28991d59 Ilias Tsitsimpis

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

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

1210 0ac84a9a Dimitris Aragiorgis
BACKEND_PER_USER = {
1211 f1800130 Ilias Tsitsimpis
  '{0}': {1},
1212 0ac84a9a Dimitris Aragiorgis
}
1213 0ac84a9a Dimitris Aragiorgis

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