Statistics
| Branch: | Tag: | Revision:

root / snf-deploy / fabfile.py @ f1b4fdfc

History | View | Annotate | Download (40 kB)

1 0ac84a9a Dimitris Aragiorgis
from __future__ import with_statement
2 0ac84a9a Dimitris Aragiorgis
from fabric.api import *
3 0ac84a9a Dimitris Aragiorgis
from fabric.contrib.console import confirm
4 0ac84a9a Dimitris Aragiorgis
from random import choice
5 0ac84a9a Dimitris Aragiorgis
from fabric.operations import run, put
6 0ac84a9a Dimitris Aragiorgis
import re
7 0ac84a9a Dimitris Aragiorgis
import shutil, os
8 0ac84a9a Dimitris Aragiorgis
from functools import wraps
9 0ac84a9a Dimitris Aragiorgis
import imp
10 0ac84a9a Dimitris Aragiorgis
import ConfigParser
11 0ac84a9a Dimitris Aragiorgis
import sys
12 0ac84a9a Dimitris Aragiorgis
import tempfile
13 0ac84a9a Dimitris Aragiorgis
import ast
14 0ac84a9a Dimitris Aragiorgis
from snfdeploy.lib import *
15 0ac84a9a Dimitris Aragiorgis
from snfdeploy import massedit
16 0ac84a9a Dimitris Aragiorgis
17 0ac84a9a Dimitris Aragiorgis
18 0ac84a9a Dimitris Aragiorgis
def setup_env(confdir="conf", packages="packages",
19 8780d2fa Dimitris Aragiorgis
              templates="files", cluster_name="ganeti1", autoconf=False, disable_colors=False, key_inject=False):
20 0ac84a9a Dimitris Aragiorgis
    print("Loading configuration for synnefo...")
21 0ac84a9a Dimitris Aragiorgis
    print(" * Using config files under %s..." % confdir)
22 0ac84a9a Dimitris Aragiorgis
    print(" * Using %s and %s for packages and templates accordingly..." % (packages, templates))
23 0ac84a9a Dimitris Aragiorgis
24 0ac84a9a Dimitris Aragiorgis
    autoconf = ast.literal_eval(autoconf)
25 1bc6d467 Dionysis Grigoropoulos
    disable_colors = ast.literal_eval(disable_colors)
26 8780d2fa Dimitris Aragiorgis
    env.key_inject = ast.literal_eval(key_inject)
27 0ac84a9a Dimitris Aragiorgis
    conf = Conf.configure(confdir=confdir, cluster_name=cluster_name, autoconf=autoconf)
28 0ac84a9a Dimitris Aragiorgis
    env.env = Env(conf)
29 0ac84a9a Dimitris Aragiorgis
30 0ac84a9a Dimitris Aragiorgis
    env.local = autoconf
31 0ac84a9a Dimitris Aragiorgis
    env.password = env.env.password
32 0ac84a9a Dimitris Aragiorgis
    env.user = env.env.user
33 0ac84a9a Dimitris Aragiorgis
    env.shell = "/bin/bash -c"
34 0ac84a9a Dimitris Aragiorgis
35 1bc6d467 Dionysis Grigoropoulos
    if disable_colors:
36 1bc6d467 Dionysis Grigoropoulos
        disable_color()
37 1bc6d467 Dionysis Grigoropoulos
38 0ac84a9a Dimitris Aragiorgis
    if env.env.cms.hostname in [env.env.accounts.hostname, env.env.cyclades.hostname, env.env.pithos.hostname]:
39 0ac84a9a Dimitris Aragiorgis
      env.cms_pass = True
40 0ac84a9a Dimitris Aragiorgis
    else:
41 0ac84a9a Dimitris Aragiorgis
      env.cms_pass = False
42 0ac84a9a Dimitris Aragiorgis
43 0ac84a9a Dimitris Aragiorgis
    if env.env.accounts.hostname in [env.env.cyclades.hostname, env.env.pithos.hostname]:
44 0ac84a9a Dimitris Aragiorgis
      env.csrf_disable = True
45 0ac84a9a Dimitris Aragiorgis
    else:
46 0ac84a9a Dimitris Aragiorgis
      env.csrf_disable = False
47 0ac84a9a Dimitris Aragiorgis
48 0ac84a9a Dimitris Aragiorgis
49 0ac84a9a Dimitris Aragiorgis
    env.roledefs = {
50 0ac84a9a Dimitris Aragiorgis
        "nodes": env.env.ips,
51 0ac84a9a Dimitris Aragiorgis
        "ips": env.env.ips,
52 0ac84a9a Dimitris Aragiorgis
        "accounts": [env.env.accounts.ip],
53 0ac84a9a Dimitris Aragiorgis
        "cyclades": [env.env.cyclades.ip],
54 0ac84a9a Dimitris Aragiorgis
        "pithos": [env.env.pithos.ip],
55 0ac84a9a Dimitris Aragiorgis
        "cms": [env.env.cms.ip],
56 0ac84a9a Dimitris Aragiorgis
        "mq": [env.env.mq.ip],
57 0ac84a9a Dimitris Aragiorgis
        "db": [env.env.db.ip],
58 0ac84a9a Dimitris Aragiorgis
        "ns": [env.env.ns.ip],
59 0ac84a9a Dimitris Aragiorgis
        "client": [env.env.client.ip],
60 0ac84a9a Dimitris Aragiorgis
        "router": [env.env.router.ip],
61 0ac84a9a Dimitris Aragiorgis
    }
62 0ac84a9a Dimitris Aragiorgis
63 0ac84a9a Dimitris Aragiorgis
    env.enable_lvm = False
64 0ac84a9a Dimitris Aragiorgis
    env.enable_drbd = False
65 0ac84a9a Dimitris Aragiorgis
    if ast.literal_eval(env.env.create_extra_disk) and env.env.extra_disk:
66 0ac84a9a Dimitris Aragiorgis
        env.enable_lvm = True
67 0ac84a9a Dimitris Aragiorgis
        env.enable_drbd = True
68 0ac84a9a Dimitris Aragiorgis
69 0ac84a9a Dimitris Aragiorgis
    env.roledefs.update({
70 0ac84a9a Dimitris Aragiorgis
        "ganeti": env.env.cluster_ips,
71 0ac84a9a Dimitris Aragiorgis
        "master": [env.env.master.ip],
72 0ac84a9a Dimitris Aragiorgis
    })
73 0ac84a9a Dimitris Aragiorgis
74 0ac84a9a Dimitris Aragiorgis
75 0ac84a9a Dimitris Aragiorgis
def install_package(package):
76 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Installing package %s..." % package)
77 0ac84a9a Dimitris Aragiorgis
    APT_GET = "export DEBIAN_FRONTEND=noninteractive ;apt-get install -y --force-yes "
78 0ac84a9a Dimitris Aragiorgis
79 f1b4fdfc Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
80 0ac84a9a Dimitris Aragiorgis
    if ast.literal_eval(env.env.use_local_packages):
81 0ac84a9a Dimitris Aragiorgis
        with settings(warn_only=True):
82 f1b4fdfc Dimitris Aragiorgis
            deb = local("ls %s/%s*%s.deb" % (env.env.packages, package, host_info[os]))
83 0ac84a9a Dimitris Aragiorgis
            if deb:
84 0ac84a9a Dimitris Aragiorgis
                debug(env.host, " * Package %s found in %s..." % (package, env.env.packages))
85 0ac84a9a Dimitris Aragiorgis
                put(deb, "/tmp/")
86 0ac84a9a Dimitris Aragiorgis
                try_run("dpkg -i /tmp/%s*deb || " % package + APT_GET + "-f")
87 0ac84a9a Dimitris Aragiorgis
                try_run("rm /tmp/%s*deb" % package)
88 0ac84a9a Dimitris Aragiorgis
                return
89 0ac84a9a Dimitris Aragiorgis
90 0ac84a9a Dimitris Aragiorgis
    info = getattr(env.env, package)
91 f1b4fdfc Dimitris Aragiorgis
    if info in ["squeeze-backports", "stable", "testing", "unstable"]:
92 f1b4fdfc Dimitris Aragiorgis
        if  info == "squeeze-backports" and host_infa.os = "wheezy":
93 f1b4fdfc Dimitris Aragiorgis
          info = host_info.os
94 0ac84a9a Dimitris Aragiorgis
        APT_GET += " -t %s %s " % (info, package)
95 0ac84a9a Dimitris Aragiorgis
    elif info:
96 0ac84a9a Dimitris Aragiorgis
        APT_GET += " %s=%s " % (package, info)
97 0ac84a9a Dimitris Aragiorgis
    else:
98 0ac84a9a Dimitris Aragiorgis
        APT_GET += package
99 0ac84a9a Dimitris Aragiorgis
100 0ac84a9a Dimitris Aragiorgis
    try_run(APT_GET)
101 0ac84a9a Dimitris Aragiorgis
102 0ac84a9a Dimitris Aragiorgis
    return
103 0ac84a9a Dimitris Aragiorgis
104 0ac84a9a Dimitris Aragiorgis
105 0ac84a9a Dimitris Aragiorgis
@roles("ns")
106 0ac84a9a Dimitris Aragiorgis
def update_ns_for_ganeti():
107 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Updating name server entries for backend %s..." % env.env.cluster.fqdn)
108 0ac84a9a Dimitris Aragiorgis
    update_arecord(env.env.cluster)
109 0ac84a9a Dimitris Aragiorgis
    update_ptrrecord(env.env.cluster)
110 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/bind9 restart")
111 0ac84a9a Dimitris Aragiorgis
112 0ac84a9a Dimitris Aragiorgis
113 0ac84a9a Dimitris Aragiorgis
@roles("ns")
114 0ac84a9a Dimitris Aragiorgis
def update_ns_for_node(node):
115 0ac84a9a Dimitris Aragiorgis
    info = env.env.nodes_info.get(node)
116 0ac84a9a Dimitris Aragiorgis
    update_arecord(info)
117 0ac84a9a Dimitris Aragiorgis
    update_ptrrecord(info)
118 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/bind9 restart")
119 0ac84a9a Dimitris Aragiorgis
120 0ac84a9a Dimitris Aragiorgis
121 0ac84a9a Dimitris Aragiorgis
@roles("ns")
122 0ac84a9a Dimitris Aragiorgis
def update_arecord(host):
123 0ac84a9a Dimitris Aragiorgis
    filename = "/etc/bind/zones/" + env.env.domain
124 0ac84a9a Dimitris Aragiorgis
    cmd = """
125 0ac84a9a Dimitris Aragiorgis
    echo '{0}' >> {1}
126 0ac84a9a Dimitris Aragiorgis
    """.format(host.arecord, filename)
127 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
128 0ac84a9a Dimitris Aragiorgis
129 0ac84a9a Dimitris Aragiorgis
130 0ac84a9a Dimitris Aragiorgis
@roles("ns")
131 0ac84a9a Dimitris Aragiorgis
def update_cnamerecord(host):
132 0ac84a9a Dimitris Aragiorgis
    filename = "/etc/bind/zones/" + env.env.domain
133 0ac84a9a Dimitris Aragiorgis
    cmd = """
134 0ac84a9a Dimitris Aragiorgis
    echo '{0}' >> {1}
135 0ac84a9a Dimitris Aragiorgis
    """.format(host.cnamerecord, filename)
136 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
137 0ac84a9a Dimitris Aragiorgis
138 0ac84a9a Dimitris Aragiorgis
139 0ac84a9a Dimitris Aragiorgis
@roles("ns")
140 0ac84a9a Dimitris Aragiorgis
def update_ptrrecord(host):
141 0ac84a9a Dimitris Aragiorgis
    filename = "/etc/bind/rev/synnefo.in-addr.arpa.zone"
142 0ac84a9a Dimitris Aragiorgis
    cmd = """
143 0ac84a9a Dimitris Aragiorgis
    echo '{0}' >> {1}
144 0ac84a9a Dimitris Aragiorgis
    """.format(host.ptrrecord, filename)
145 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
146 0ac84a9a Dimitris Aragiorgis
147 0ac84a9a Dimitris Aragiorgis
@roles("nodes")
148 0ac84a9a Dimitris Aragiorgis
def apt_get_update():
149 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "apt-get update....")
150 0ac84a9a Dimitris Aragiorgis
    try_run("apt-get update")
151 0ac84a9a Dimitris Aragiorgis
152 0ac84a9a Dimitris Aragiorgis
@roles("ns")
153 0ac84a9a Dimitris Aragiorgis
def setup_ns():
154 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Setting up name server..")
155 0ac84a9a Dimitris Aragiorgis
    #WARNING: this should be remove after we are done
156 0ac84a9a Dimitris Aragiorgis
    # because gevent does pick randomly nameservers and google does
157 0ac84a9a Dimitris Aragiorgis
    # not know our setup!!!!!
158 0ac84a9a Dimitris Aragiorgis
    apt_get_update()
159 0ac84a9a Dimitris Aragiorgis
    install_package("bind9")
160 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/bind/named.conf.local"
161 0ac84a9a Dimitris Aragiorgis
    replace = {
162 0ac84a9a Dimitris Aragiorgis
      "domain": env.env.domain,
163 0ac84a9a Dimitris Aragiorgis
      }
164 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
165 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl)
166 0ac84a9a Dimitris Aragiorgis
167 0ac84a9a Dimitris Aragiorgis
    try_run("mkdir -p /etc/bind/zones")
168 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/bind/zones/example.com"
169 0ac84a9a Dimitris Aragiorgis
    replace = {
170 0ac84a9a Dimitris Aragiorgis
      "domain": env.env.domain,
171 0ac84a9a Dimitris Aragiorgis
      "ns_node_ip": env.env.ns.ip,
172 0ac84a9a Dimitris Aragiorgis
      }
173 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
174 0ac84a9a Dimitris Aragiorgis
    remote = "/etc/bind/zones/" + env.env.domain
175 0ac84a9a Dimitris Aragiorgis
    put(custom, remote)
176 0ac84a9a Dimitris Aragiorgis
177 0ac84a9a Dimitris Aragiorgis
    try_run("mkdir -p /etc/bind/rev")
178 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/bind/rev/synnefo.in-addr.arpa.zone"
179 0ac84a9a Dimitris Aragiorgis
    replace = {
180 0ac84a9a Dimitris Aragiorgis
      "domain": env.env.domain,
181 0ac84a9a Dimitris Aragiorgis
      }
182 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
183 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl)
184 0ac84a9a Dimitris Aragiorgis
185 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/bind/named.conf.options"
186 0ac84a9a Dimitris Aragiorgis
    replace = {
187 0ac84a9a Dimitris Aragiorgis
      "NODE_IPS": ";".join(env.env.ips),
188 0ac84a9a Dimitris Aragiorgis
      }
189 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
190 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
191 0ac84a9a Dimitris Aragiorgis
192 0ac84a9a Dimitris Aragiorgis
    for role, info in env.env.roles.iteritems():
193 0ac84a9a Dimitris Aragiorgis
        if role == "ns":
194 0ac84a9a Dimitris Aragiorgis
            continue
195 0ac84a9a Dimitris Aragiorgis
        update_cnamerecord(info)
196 0ac84a9a Dimitris Aragiorgis
    for node, info in env.env.nodes_info.iteritems():
197 0ac84a9a Dimitris Aragiorgis
        update_arecord(info)
198 0ac84a9a Dimitris Aragiorgis
        update_ptrrecord(info)
199 0ac84a9a Dimitris Aragiorgis
200 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/bind9 restart")
201 0ac84a9a Dimitris Aragiorgis
202 0ac84a9a Dimitris Aragiorgis
203 0ac84a9a Dimitris Aragiorgis
@roles("nodes")
204 0ac84a9a Dimitris Aragiorgis
def check_dhcp():
205 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Checking IPs for synnefo..")
206 0ac84a9a Dimitris Aragiorgis
    for n, info in env.env.nodes_info.iteritems():
207 df1d01d4 Dimitris Aragiorgis
        try_run("ping -c 1 " + info.ip, True)
208 0ac84a9a Dimitris Aragiorgis
209 0ac84a9a Dimitris Aragiorgis
@roles("nodes")
210 0ac84a9a Dimitris Aragiorgis
def check_dns():
211 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Checking fqdns for synnefo..")
212 0ac84a9a Dimitris Aragiorgis
    for n, info in env.env.nodes_info.iteritems():
213 df1d01d4 Dimitris Aragiorgis
        try_run("ping -c 1 " + info.fqdn, True)
214 0ac84a9a Dimitris Aragiorgis
215 0ac84a9a Dimitris Aragiorgis
    for n, info in env.env.roles.iteritems():
216 df1d01d4 Dimitris Aragiorgis
        try_run("ping -c 1 " + info.fqdn, True)
217 0ac84a9a Dimitris Aragiorgis
218 0ac84a9a Dimitris Aragiorgis
@roles("nodes")
219 0ac84a9a Dimitris Aragiorgis
def check_connectivity():
220 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Checking internet connectivity..")
221 df1d01d4 Dimitris Aragiorgis
    try_run("ping -c 1 www.google.com", True)
222 0ac84a9a Dimitris Aragiorgis
223 0ac84a9a Dimitris Aragiorgis
224 0ac84a9a Dimitris Aragiorgis
@roles("nodes")
225 0ac84a9a Dimitris Aragiorgis
def check_ssh():
226 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Checking password-less ssh..")
227 0ac84a9a Dimitris Aragiorgis
    for n, info in env.env.nodes_info.iteritems():
228 df1d01d4 Dimitris Aragiorgis
        try_run("ssh " + info.fqdn + "  date", True)
229 0ac84a9a Dimitris Aragiorgis
230 0ac84a9a Dimitris Aragiorgis
231 0ac84a9a Dimitris Aragiorgis
@roles("ips")
232 0ac84a9a Dimitris Aragiorgis
def add_keys():
233 8780d2fa Dimitris Aragiorgis
    if not env.key_inject:
234 8f5ea521 Dimitris Aragiorgis
      debug(env.host, "Skipping ssh keys injection..")
235 8780d2fa Dimitris Aragiorgis
      return
236 8780d2fa Dimitris Aragiorgis
    else:
237 8780d2fa Dimitris Aragiorgis
      debug(env.host, "Adding rsa/dsa keys..")
238 0ac84a9a Dimitris Aragiorgis
    try_run("mkdir -p /root/.ssh")
239 0ac84a9a Dimitris Aragiorgis
    cmd = """
240 0ac84a9a Dimitris Aragiorgis
for f in $(ls /root/.ssh/*); do
241 0ac84a9a Dimitris Aragiorgis
  cp $f $f.bak
242 0ac84a9a Dimitris Aragiorgis
done
243 0ac84a9a Dimitris Aragiorgis
    """
244 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
245 0ac84a9a Dimitris Aragiorgis
    files = ["authorized_keys", "id_dsa", "id_dsa.pub",
246 0ac84a9a Dimitris Aragiorgis
             "id_rsa", "id_rsa.pub"]
247 0ac84a9a Dimitris Aragiorgis
    for f in files:
248 0ac84a9a Dimitris Aragiorgis
      tmpl = "/root/.ssh/" + f
249 0ac84a9a Dimitris Aragiorgis
      replace = {}
250 0ac84a9a Dimitris Aragiorgis
      custom = customize_settings_from_tmpl(tmpl, replace)
251 c61f4b8c Dimitris Aragiorgis
      put(custom, tmpl, mode=0600)
252 0ac84a9a Dimitris Aragiorgis
253 0ac84a9a Dimitris Aragiorgis
    cmd = """
254 0ac84a9a Dimitris Aragiorgis
if [ -e /root/.ssh/authorized_keys.bak ]; then
255 0ac84a9a Dimitris Aragiorgis
  cat /root/.ssh/authorized_keys.bak >> /root/.ssh/authorized_keys
256 0ac84a9a Dimitris Aragiorgis
fi
257 0ac84a9a Dimitris Aragiorgis
    """
258 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Updating exising authorized keys..")
259 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
260 0ac84a9a Dimitris Aragiorgis
261 0ac84a9a Dimitris Aragiorgis
@roles("ips")
262 0ac84a9a Dimitris Aragiorgis
def setup_resolv_conf():
263 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Tweak /etc/resolv.conf...")
264 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/network-manager stop")
265 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/dhcp/dhclient-enter-hooks.d/nodnsupdate"
266 0ac84a9a Dimitris Aragiorgis
    replace = {}
267 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
268 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
269 0ac84a9a Dimitris Aragiorgis
    try_run("cp /etc/resolv.conf /etc/resolv.conf.bak")
270 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/resolv.conf"
271 0ac84a9a Dimitris Aragiorgis
    replace = {
272 0ac84a9a Dimitris Aragiorgis
      "domain": env.env.domain,
273 0ac84a9a Dimitris Aragiorgis
      "ns_node_ip": env.env.ns.ip,
274 0ac84a9a Dimitris Aragiorgis
      }
275 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
276 703d78d6 Dimitris Aragiorgis
    try:
277 703d78d6 Dimitris Aragiorgis
      put(custom, tmpl)
278 703d78d6 Dimitris Aragiorgis
    except:
279 703d78d6 Dimitris Aragiorgis
      pass
280 0ac84a9a Dimitris Aragiorgis
    try_run("chattr +i /etc/resolv.conf")
281 0ac84a9a Dimitris Aragiorgis
282 0ac84a9a Dimitris Aragiorgis
283 0ac84a9a Dimitris Aragiorgis
@roles("ips")
284 0ac84a9a Dimitris Aragiorgis
def setup_hosts():
285 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Tweaking /etc/hosts and ssh_config files...")
286 0ac84a9a Dimitris Aragiorgis
    try_run("echo StrictHostKeyChecking no >> /etc/ssh/ssh_config")
287 8665d8b6 Dimitris Aragiorgis
    cmd = " sed -i 's/^127.*/127.0.0.1 localhost/' /etc/hosts "
288 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
289 6e0e55ba Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
290 6e0e55ba Dimitris Aragiorgis
    cmd = "hostname %s" % host_info.hostname
291 6e0e55ba Dimitris Aragiorgis
    try_run(cmd)
292 6e0e55ba Dimitris Aragiorgis
    cmd = "echo %s > /etc/hostname" % host_info.hostname
293 6e0e55ba Dimitris Aragiorgis
    try_run(cmd)
294 0ac84a9a Dimitris Aragiorgis
295 0ac84a9a Dimitris Aragiorgis
296 df1d01d4 Dimitris Aragiorgis
def try_run(cmd, abort=False):
297 0ac84a9a Dimitris Aragiorgis
    try:
298 0ac84a9a Dimitris Aragiorgis
      if env.local:
299 0ac84a9a Dimitris Aragiorgis
        return local(cmd, capture=True)
300 0ac84a9a Dimitris Aragiorgis
      else:
301 0ac84a9a Dimitris Aragiorgis
        return run(cmd)
302 0ac84a9a Dimitris Aragiorgis
    except:
303 0ac84a9a Dimitris Aragiorgis
      debug(env.host, "WARNING: command failed. Continuing anyway...")
304 df1d01d4 Dimitris Aragiorgis
      if abort:
305 df1d01d4 Dimitris Aragiorgis
        raise
306 0ac84a9a Dimitris Aragiorgis
307 0ac84a9a Dimitris Aragiorgis
def create_bridges():
308 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Creating bridges...")
309 0ac84a9a Dimitris Aragiorgis
    install_package("bridge-utils")
310 0ac84a9a Dimitris Aragiorgis
    cmd = """
311 0ac84a9a Dimitris Aragiorgis
    brctl addbr {0} ; ip link set {0} up
312 0ac84a9a Dimitris Aragiorgis
    """.format(env.env.common_bridge)
313 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
314 0ac84a9a Dimitris Aragiorgis
315 0ac84a9a Dimitris Aragiorgis
316 0ac84a9a Dimitris Aragiorgis
def connect_bridges():
317 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Connecting bridges...")
318 0ac84a9a Dimitris Aragiorgis
    cmd = """
319 0ac84a9a Dimitris Aragiorgis
    brctl addif {0} {1}
320 0ac84a9a Dimitris Aragiorgis
    """.format(env.env.common_bridge, env.env.public_iface)
321 0ac84a9a Dimitris Aragiorgis
    #try_run(cmd)
322 0ac84a9a Dimitris Aragiorgis
323 0ac84a9a Dimitris Aragiorgis
324 0ac84a9a Dimitris Aragiorgis
@roles("ganeti")
325 0ac84a9a Dimitris Aragiorgis
def setup_net_infra():
326 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Setup networking infrastracture..")
327 0ac84a9a Dimitris Aragiorgis
    create_bridges()
328 0ac84a9a Dimitris Aragiorgis
    connect_bridges()
329 0ac84a9a Dimitris Aragiorgis
330 0ac84a9a Dimitris Aragiorgis
331 0ac84a9a Dimitris Aragiorgis
@roles("ganeti")
332 0ac84a9a Dimitris Aragiorgis
def setup_lvm():
333 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "create volume group %s for ganeti.." % env.env.vg)
334 0ac84a9a Dimitris Aragiorgis
    if env.enable_lvm:
335 0ac84a9a Dimitris Aragiorgis
        install_package("lvm2")
336 0ac84a9a Dimitris Aragiorgis
        cmd = """
337 0ac84a9a Dimitris Aragiorgis
        pvcreate {0}
338 0ac84a9a Dimitris Aragiorgis
        vgcreate {1} {0}
339 0ac84a9a Dimitris Aragiorgis
        """.format(env.env.extra_disk, env.env.vg)
340 0ac84a9a Dimitris Aragiorgis
        try_run(cmd)
341 0ac84a9a Dimitris Aragiorgis
342 0ac84a9a Dimitris Aragiorgis
343 0ac84a9a Dimitris Aragiorgis
def customize_settings_from_tmpl(tmpl, replace):
344 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Customizing template %s..." % tmpl)
345 0ac84a9a Dimitris Aragiorgis
    local = env.env.templates + tmpl
346 0ac84a9a Dimitris Aragiorgis
    _, custom = tempfile.mkstemp()
347 0ac84a9a Dimitris Aragiorgis
    shutil.copyfile(local, custom)
348 0ac84a9a Dimitris Aragiorgis
    for k, v in replace.iteritems():
349 0ac84a9a Dimitris Aragiorgis
        regex = "re.sub('%{0}%', '{1}', line)".format(k.upper(), v)
350 0ac84a9a Dimitris Aragiorgis
        massedit.edit_files([custom], [regex], dry_run=False)
351 0ac84a9a Dimitris Aragiorgis
352 0ac84a9a Dimitris Aragiorgis
    return custom
353 0ac84a9a Dimitris Aragiorgis
354 0ac84a9a Dimitris Aragiorgis
355 0ac84a9a Dimitris Aragiorgis
@roles("nodes")
356 0ac84a9a Dimitris Aragiorgis
def setup_apt():
357 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Setting up apt sources...")
358 0ac84a9a Dimitris Aragiorgis
    install_package("curl")
359 0ac84a9a Dimitris Aragiorgis
    cmd = """
360 0ac84a9a Dimitris Aragiorgis
    echo 'APT::Install-Suggests "false";' >> /etc/apt/apt.conf
361 0ac84a9a Dimitris Aragiorgis
    curl -k https://dev.grnet.gr/files/apt-grnetdev.pub | apt-key add -
362 0ac84a9a Dimitris Aragiorgis
    """
363 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
364 f1b4fdfc Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
365 f1b4fdfc Dimitris Aragiorgis
    if host_info.os == "squeeze":
366 f1b4fdfc Dimitris Aragiorgis
      tmpl = "/etc/apt/sources.list.d/synnefo.squeeze.list"
367 f1b4fdfc Dimitris Aragiorgis
    else:
368 f1b4fdfc Dimitris Aragiorgis
      tmpl = "/etc/apt/sources.list.d/synnefo.wheezy.list"
369 0ac84a9a Dimitris Aragiorgis
    replace = {}
370 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
371 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl)
372 0ac84a9a Dimitris Aragiorgis
    apt_get_update()
373 0ac84a9a Dimitris Aragiorgis
374 0ac84a9a Dimitris Aragiorgis
375 0ac84a9a Dimitris Aragiorgis
@roles("cyclades", "cms", "pithos", "accounts")
376 0ac84a9a Dimitris Aragiorgis
def restart_services():
377 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Restarting apache2 and gunicorn...")
378 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
379 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/apache2 restart")
380 0ac84a9a Dimitris Aragiorgis
381 0ac84a9a Dimitris Aragiorgis
382 0ac84a9a Dimitris Aragiorgis
def setup_gunicorn():
383 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Setting up gunicorn...")
384 0ac84a9a Dimitris Aragiorgis
    install_package("gunicorn")
385 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/gunicorn.d/synnefo"
386 0ac84a9a Dimitris Aragiorgis
    replace = {}
387 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
388 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
389 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
390 0ac84a9a Dimitris Aragiorgis
391 0ac84a9a Dimitris Aragiorgis
392 0ac84a9a Dimitris Aragiorgis
def setup_apache():
393 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Setting up apache2...")
394 0ac84a9a Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
395 0ac84a9a Dimitris Aragiorgis
    install_package("apache2")
396 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/apache2/sites-available/synnefo"
397 0ac84a9a Dimitris Aragiorgis
    replace = {
398 0ac84a9a Dimitris Aragiorgis
        "HOST": host_info.fqdn,
399 0ac84a9a Dimitris Aragiorgis
    }
400 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
401 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl)
402 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/apache2/sites-available/synnefo-ssl"
403 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
404 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl)
405 0ac84a9a Dimitris Aragiorgis
    cmd = """
406 0ac84a9a Dimitris Aragiorgis
    a2enmod ssl
407 0ac84a9a Dimitris Aragiorgis
    a2enmod rewrite
408 0ac84a9a Dimitris Aragiorgis
    a2dissite default
409 0ac84a9a Dimitris Aragiorgis
    a2ensite synnefo
410 0ac84a9a Dimitris Aragiorgis
    a2ensite synnefo-ssl
411 0ac84a9a Dimitris Aragiorgis
    a2enmod headers
412 0ac84a9a Dimitris Aragiorgis
    a2enmod proxy_http
413 0ac84a9a Dimitris Aragiorgis
    a2dismod autoindex
414 0ac84a9a Dimitris Aragiorgis
    """
415 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
416 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/apache2 restart")
417 0ac84a9a Dimitris Aragiorgis
418 0ac84a9a Dimitris Aragiorgis
419 0ac84a9a Dimitris Aragiorgis
@roles("mq")
420 0ac84a9a Dimitris Aragiorgis
def setup_mq():
421 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Setting up RabbitMQ...")
422 0ac84a9a Dimitris Aragiorgis
    install_package("rabbitmq-server")
423 0ac84a9a Dimitris Aragiorgis
    cmd = """
424 0ac84a9a Dimitris Aragiorgis
    rabbitmqctl add_user {0} {1}
425 0ac84a9a Dimitris Aragiorgis
    rabbitmqctl set_permissions {0} ".*" ".*" ".*"
426 0ac84a9a Dimitris Aragiorgis
    rabbitmqctl delete_user guest
427 0ac84a9a Dimitris Aragiorgis
    rabbitmqctl set_user_tags {0} administrator
428 0ac84a9a Dimitris Aragiorgis
    """.format(env.env.synnefo_user, env.env.synnefo_rabbitmq_passwd)
429 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
430 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/rabbitmq-server restart")
431 0ac84a9a Dimitris Aragiorgis
432 0ac84a9a Dimitris Aragiorgis
433 0ac84a9a Dimitris Aragiorgis
@roles("db")
434 108fbde6 Dimitris Aragiorgis
def allow_access_in_db(ip, user="all", method="md5"):
435 0ac84a9a Dimitris Aragiorgis
    cmd = """
436 108fbde6 Dimitris Aragiorgis
    echo host all {0} {1}/32 {2} >> /etc/postgresql/8.4/main/pg_hba.conf
437 108fbde6 Dimitris Aragiorgis
    """.format(user, ip, method)
438 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
439 61aedf5a Christos Stavrakakis
    cmd = """
440 561d42ec Christos Stavrakakis
    sed -i 's/\(host.*127.0.0.1.*\)md5/\\1trust/' /etc/postgresql/8.4/main/pg_hba.conf
441 61aedf5a Christos Stavrakakis
    """
442 61aedf5a Christos Stavrakakis
    try_run(cmd)
443 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/postgresql restart")
444 0ac84a9a Dimitris Aragiorgis
445 0ac84a9a Dimitris Aragiorgis
@roles("db")
446 0ac84a9a Dimitris Aragiorgis
def setup_db():
447 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Setting up DataBase server...")
448 0ac84a9a Dimitris Aragiorgis
    install_package("postgresql")
449 0ac84a9a Dimitris Aragiorgis
450 0ac84a9a Dimitris Aragiorgis
    tmpl = "/tmp/db-init.psql"
451 0ac84a9a Dimitris Aragiorgis
    replace = {
452 0ac84a9a Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
453 0ac84a9a Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
454 0ac84a9a Dimitris Aragiorgis
        }
455 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
456 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl)
457 0ac84a9a Dimitris Aragiorgis
    cmd = 'su - postgres -c "psql -w -f %s" ' % tmpl
458 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
459 0ac84a9a Dimitris Aragiorgis
    cmd = """
460 0ac84a9a Dimitris Aragiorgis
    echo "listen_addresses = '*'" >> /etc/postgresql/8.4/main/postgresql.conf
461 0ac84a9a Dimitris Aragiorgis
    """
462 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
463 0ac84a9a Dimitris Aragiorgis
464 bd9b6f21 Christos Stavrakakis
    if env.env.testing_vm:
465 bd9b6f21 Christos Stavrakakis
        cmd = """
466 bd9b6f21 Christos Stavrakakis
        echo "fsync=off\nsynchronous_commit=off\nfull_page_writes=off" >> /etc/postgresql/8.4/main/postgresql.conf
467 bd9b6f21 Christos Stavrakakis
        """
468 bd9b6f21 Christos Stavrakakis
        try_run(cmd)
469 bd9b6f21 Christos Stavrakakis
470 108fbde6 Dimitris Aragiorgis
    allow_access_in_db(env.host, "all", "trust")
471 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/postgresql restart")
472 0ac84a9a Dimitris Aragiorgis
473 0ac84a9a Dimitris Aragiorgis
474 0ac84a9a Dimitris Aragiorgis
@roles("db")
475 0ac84a9a Dimitris Aragiorgis
def destroy_db():
476 0ac84a9a Dimitris Aragiorgis
    try_run("""su - postgres -c ' psql -w -c "drop database snf_apps" '""")
477 0ac84a9a Dimitris Aragiorgis
    try_run("""su - postgres -c ' psql -w -c "drop database snf_pithos" '""")
478 0ac84a9a Dimitris Aragiorgis
479 0ac84a9a Dimitris Aragiorgis
480 0ac84a9a Dimitris Aragiorgis
def setup_webproject():
481 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Setting up snf-webproject...")
482 0ac84a9a Dimitris Aragiorgis
    with settings(hide("everything")):
483 0ac84a9a Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.db.ip)
484 0ac84a9a Dimitris Aragiorgis
    setup_common()
485 0ac84a9a Dimitris Aragiorgis
    install_package("snf-webproject")
486 0ac84a9a Dimitris Aragiorgis
    install_package("python-psycopg2")
487 0ac84a9a Dimitris Aragiorgis
    install_package("python-gevent")
488 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/synnefo/webproject.conf"
489 0ac84a9a Dimitris Aragiorgis
    replace = {
490 0ac84a9a Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
491 0ac84a9a Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
492 0ac84a9a Dimitris Aragiorgis
        "db_node": env.env.db.ip,
493 0ac84a9a Dimitris Aragiorgis
        "domain": env.env.domain,
494 0ac84a9a Dimitris Aragiorgis
    }
495 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
496 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
497 1d8cf97d Dimitris Aragiorgis
    with settings(host_string=env.env.db.ip):
498 0ac84a9a Dimitris Aragiorgis
        host_info = env.env.ips_info[env.host]
499 108fbde6 Dimitris Aragiorgis
        allow_access_in_db(host_info.ip, "all", "trust")
500 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
501 0ac84a9a Dimitris Aragiorgis
502 0ac84a9a Dimitris Aragiorgis
503 0ac84a9a Dimitris Aragiorgis
def setup_common():
504 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Setting up snf-common...")
505 0ac84a9a Dimitris Aragiorgis
    host_info = env.env.ips_info[env.host]
506 0ac84a9a Dimitris Aragiorgis
    install_package("python-objpool")
507 0ac84a9a Dimitris Aragiorgis
    install_package("snf-common")
508 0ac84a9a Dimitris Aragiorgis
    install_package("python-astakosclient")
509 0ac84a9a Dimitris Aragiorgis
    install_package("snf-django-lib")
510 0ac84a9a Dimitris Aragiorgis
    install_package("snf-branding")
511 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/synnefo/common.conf"
512 0ac84a9a Dimitris Aragiorgis
    replace = {
513 0ac84a9a Dimitris Aragiorgis
        #FIXME:
514 0ac84a9a Dimitris Aragiorgis
        "EMAIL_SUBJECT_PREFIX": env.host,
515 0ac84a9a Dimitris Aragiorgis
        "domain": env.env.domain,
516 0ac84a9a Dimitris Aragiorgis
        "HOST": host_info.fqdn,
517 0ac84a9a Dimitris Aragiorgis
    }
518 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
519 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
520 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
521 0ac84a9a Dimitris Aragiorgis
522 0ac84a9a Dimitris Aragiorgis
@roles("accounts")
523 0ac84a9a Dimitris Aragiorgis
def astakos_loaddata():
524 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Loading initial data to astakos...")
525 0ac84a9a Dimitris Aragiorgis
    cmd = """
526 0ac84a9a Dimitris Aragiorgis
    snf-manage loaddata groups
527 0ac84a9a Dimitris Aragiorgis
    """
528 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
529 0ac84a9a Dimitris Aragiorgis
530 0ac84a9a Dimitris Aragiorgis
531 0ac84a9a Dimitris Aragiorgis
@roles("accounts")
532 65c656c1 Giorgos Korfiatis
def astakos_register_services():
533 65c656c1 Giorgos Korfiatis
    debug(env.host, " * Register services in astakos...")
534 65c656c1 Giorgos Korfiatis
535 65c656c1 Giorgos Korfiatis
    cyclades_base_url = "https://%s/cyclades/" % env.env.cyclades.fqdn
536 65c656c1 Giorgos Korfiatis
    pithos_base_url = "https://%s/pithos/" % env.env.pithos.fqdn
537 65c656c1 Giorgos Korfiatis
    astakos_base_url = "https://%s/astakos/" % env.env.accounts.fqdn
538 65c656c1 Giorgos Korfiatis
539 0ac84a9a Dimitris Aragiorgis
    cmd = """
540 0ac84a9a Dimitris Aragiorgis
    snf-manage component-add "home" https://{0} home-icon.png
541 65c656c1 Giorgos Korfiatis
    snf-manage component-add "cyclades" {1}ui/
542 65c656c1 Giorgos Korfiatis
    snf-manage component-add "pithos" {2}ui/
543 65c656c1 Giorgos Korfiatis
    snf-manage component-add "astakos" {3}ui/
544 65c656c1 Giorgos Korfiatis
    """.format(env.env.cms.fqdn, cyclades_base_url,
545 65c656c1 Giorgos Korfiatis
               pithos.base_url, astakos_base_url)
546 65c656c1 Giorgos Korfiatis
    try_run(cmd)
547 65c656c1 Giorgos Korfiatis
    import_service("astakos", astakos_base_url)
548 65c656c1 Giorgos Korfiatis
    import_service("pithos", pithos_base_url)
549 65c656c1 Giorgos Korfiatis
    import_service("cyclades", cyclades_base_url)
550 65c656c1 Giorgos Korfiatis
    cmd = """
551 65c656c1 Giorgos Korfiatis
    snf-manage resource-modify --limit 40G pithos.diskspace
552 65c656c1 Giorgos Korfiatis
    snf-manage resource-modify --limit 2 astakos.pending_app
553 65c656c1 Giorgos Korfiatis
    snf-manage resource-modify --limit 4 cyclades.vm
554 65c656c1 Giorgos Korfiatis
    snf-manage resource-modify --limit 40G cyclades.disk
555 65c656c1 Giorgos Korfiatis
    snf-manage resource-modify --limit 8G cyclades.ram
556 65c656c1 Giorgos Korfiatis
    snf-manage resource-modify --limit 16 cyclades.cpu
557 65c656c1 Giorgos Korfiatis
    snf-manage resource-modify --limit 4 cyclades.network.private
558 65c656c1 Giorgos Korfiatis
    """
559 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
560 0ac84a9a Dimitris Aragiorgis
561 0ac84a9a Dimitris Aragiorgis
562 0ac84a9a Dimitris Aragiorgis
@roles("accounts")
563 0ac84a9a Dimitris Aragiorgis
def add_user():
564 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * adding user %s to astakos..." % env.env.user_email)
565 0ac84a9a Dimitris Aragiorgis
    email=env.env.user_email
566 0ac84a9a Dimitris Aragiorgis
    name=env.env.user_name
567 0ac84a9a Dimitris Aragiorgis
    lastname=env.env.user_lastname
568 0ac84a9a Dimitris Aragiorgis
    passwd=env.env.user_passwd
569 0ac84a9a Dimitris Aragiorgis
    cmd = """
570 0ac84a9a Dimitris Aragiorgis
    snf-manage user-add {0} {1} {2}
571 0ac84a9a Dimitris Aragiorgis
    """.format(email, name, lastname)
572 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
573 1d8cf97d Dimitris Aragiorgis
    with settings(host_string=env.env.db.ip):
574 0ac84a9a Dimitris Aragiorgis
        uid, user_auth_token, user_uuid = get_auth_token_from_db(email)
575 0ac84a9a Dimitris Aragiorgis
    cmd = """
576 0ac84a9a Dimitris Aragiorgis
    snf-manage user-modify --password {0} {1}
577 0ac84a9a Dimitris Aragiorgis
    """.format(passwd, uid)
578 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
579 0ac84a9a Dimitris Aragiorgis
580 0ac84a9a Dimitris Aragiorgis
581 0ac84a9a Dimitris Aragiorgis
@roles("accounts")
582 0ac84a9a Dimitris Aragiorgis
def activate_user(user_email=None):
583 0ac84a9a Dimitris Aragiorgis
    if not user_email:
584 0ac84a9a Dimitris Aragiorgis
      user_email = env.env.user_email
585 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Activate user %s..." % user_email)
586 1d8cf97d Dimitris Aragiorgis
    with settings(host_string=env.env.db.ip):
587 0ac84a9a Dimitris Aragiorgis
        uid, user_auth_token, user_uuid = get_auth_token_from_db(user_email)
588 0ac84a9a Dimitris Aragiorgis
589 0ac84a9a Dimitris Aragiorgis
    cmd = """
590 0ac84a9a Dimitris Aragiorgis
    snf-manage user-modify --verify {0}
591 0ac84a9a Dimitris Aragiorgis
    snf-manage user-modify --accept {0}
592 0ac84a9a Dimitris Aragiorgis
    """.format(uid)
593 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
594 0ac84a9a Dimitris Aragiorgis
595 0ac84a9a Dimitris Aragiorgis
@roles("accounts")
596 0ac84a9a Dimitris Aragiorgis
def setup_astakos():
597 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Setting up snf-astakos-app...")
598 0ac84a9a Dimitris Aragiorgis
    setup_gunicorn()
599 0ac84a9a Dimitris Aragiorgis
    setup_apache()
600 0ac84a9a Dimitris Aragiorgis
    setup_webproject()
601 0ac84a9a Dimitris Aragiorgis
    install_package("python-django-south")
602 0ac84a9a Dimitris Aragiorgis
    install_package("snf-astakos-app")
603 0ac84a9a Dimitris Aragiorgis
    install_package("kamaki")
604 0ac84a9a Dimitris Aragiorgis
605 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/synnefo/astakos.conf"
606 0ac84a9a Dimitris Aragiorgis
    replace = {
607 0ac84a9a Dimitris Aragiorgis
      "ACCOUNTS": env.env.accounts.fqdn,
608 0ac84a9a Dimitris Aragiorgis
      "domain": env.env.domain,
609 0ac84a9a Dimitris Aragiorgis
      "CYCLADES": env.env.cyclades.fqdn,
610 0ac84a9a Dimitris Aragiorgis
      "PITHOS": env.env.pithos.fqdn,
611 0ac84a9a Dimitris Aragiorgis
    }
612 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
613 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
614 0ac84a9a Dimitris Aragiorgis
    if env.csrf_disable:
615 0ac84a9a Dimitris Aragiorgis
      cmd = """
616 0ac84a9a Dimitris Aragiorgis
cat <<EOF >> /etc/synnefo/astakos.conf
617 0ac84a9a Dimitris Aragiorgis
try:
618 0ac84a9a Dimitris Aragiorgis
  MIDDLEWARE_CLASSES.remove('django.middleware.csrf.CsrfViewMiddleware')
619 0ac84a9a Dimitris Aragiorgis
except:
620 0ac84a9a Dimitris Aragiorgis
  pass
621 0ac84a9a Dimitris Aragiorgis
EOF
622 0ac84a9a Dimitris Aragiorgis
"""
623 0ac84a9a Dimitris Aragiorgis
      try_run(cmd)
624 0ac84a9a Dimitris Aragiorgis
625 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
626 0ac84a9a Dimitris Aragiorgis
627 0ac84a9a Dimitris Aragiorgis
    cmd = """
628 0ac84a9a Dimitris Aragiorgis
    snf-manage syncdb --noinput
629 0ac84a9a Dimitris Aragiorgis
    snf-manage migrate im --delete-ghost-migrations
630 0ac84a9a Dimitris Aragiorgis
    snf-manage migrate quotaholder_app
631 0ac84a9a Dimitris Aragiorgis
    """
632 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
633 0ac84a9a Dimitris Aragiorgis
634 65c656c1 Giorgos Korfiatis
635 65c656c1 Giorgos Korfiatis
def import_service(service, base_url):
636 65c656c1 Giorgos Korfiatis
    try_run("snf-service-export %s %s | snf-manage service-import -" %
637 65c656c1 Giorgos Korfiatis
            (service, base_url))
638 65c656c1 Giorgos Korfiatis
639 0ac84a9a Dimitris Aragiorgis
640 0ac84a9a Dimitris Aragiorgis
@roles("accounts")
641 0ac84a9a Dimitris Aragiorgis
def get_service_details(service="pithos"):
642 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Getting registered details for %s service..." % service)
643 0ac84a9a Dimitris Aragiorgis
    result = try_run("snf-manage component-list")
644 0ac84a9a Dimitris Aragiorgis
    r = re.compile(r".*%s.*" % service, re.M)
645 0ac84a9a Dimitris Aragiorgis
    service_id, _, _, service_token = r.search(result).group().split()
646 0ac84a9a Dimitris Aragiorgis
    # print("%s: %s %s" % (service, service_id, service_token))
647 0ac84a9a Dimitris Aragiorgis
    return (service_id, service_token)
648 0ac84a9a Dimitris Aragiorgis
649 0ac84a9a Dimitris Aragiorgis
650 0ac84a9a Dimitris Aragiorgis
@roles("db")
651 0ac84a9a Dimitris Aragiorgis
def get_auth_token_from_db(user_email=None):
652 0ac84a9a Dimitris Aragiorgis
    if not user_email:
653 0ac84a9a Dimitris Aragiorgis
        user_email=env.env.user_email
654 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Getting authentication token and uuid for user %s..." % user_email)
655 0ac84a9a Dimitris Aragiorgis
    cmd = """
656 0ac84a9a Dimitris Aragiorgis
    echo "select id, auth_token, uuid, email from auth_user, im_astakosuser where auth_user.id = im_astakosuser.user_ptr_id and auth_user.email = '{0}';" > /tmp/psqlcmd
657 0ac84a9a Dimitris Aragiorgis
    su - postgres -c  "psql -w -d snf_apps -f /tmp/psqlcmd"
658 0ac84a9a Dimitris Aragiorgis
    """.format(user_email)
659 0ac84a9a Dimitris Aragiorgis
660 0ac84a9a Dimitris Aragiorgis
    result = try_run(cmd)
661 0ac84a9a Dimitris Aragiorgis
    r = re.compile(r"(\d+)[ |]*(\S+)[ |]*(\S+)[ |]*" + user_email, re.M)
662 0ac84a9a Dimitris Aragiorgis
    match = r.search(result)
663 0ac84a9a Dimitris Aragiorgis
    uid, user_auth_token, user_uuid = match.groups()
664 0ac84a9a Dimitris Aragiorgis
    # print("%s: %s %s %s" % ( user_email, uid, user_auth_token, user_uuid))
665 0ac84a9a Dimitris Aragiorgis
666 0ac84a9a Dimitris Aragiorgis
    return (uid, user_auth_token, user_uuid)
667 0ac84a9a Dimitris Aragiorgis
668 0ac84a9a Dimitris Aragiorgis
669 0ac84a9a Dimitris Aragiorgis
@roles("cms")
670 0ac84a9a Dimitris Aragiorgis
def cms_loaddata():
671 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Loading cms initial data...")
672 0ac84a9a Dimitris Aragiorgis
    if env.cms_pass:
673 0ac84a9a Dimitris Aragiorgis
      debug(env.host, "Aborting. Prerequisites not met.")
674 0ac84a9a Dimitris Aragiorgis
      return
675 0ac84a9a Dimitris Aragiorgis
    tmpl = "/tmp/sites.json"
676 0ac84a9a Dimitris Aragiorgis
    replace = {}
677 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
678 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl)
679 0ac84a9a Dimitris Aragiorgis
680 0ac84a9a Dimitris Aragiorgis
    tmpl = "/tmp/page.json"
681 0ac84a9a Dimitris Aragiorgis
    replace = {}
682 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
683 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl)
684 0ac84a9a Dimitris Aragiorgis
685 0ac84a9a Dimitris Aragiorgis
    cmd = """
686 0ac84a9a Dimitris Aragiorgis
    snf-manage loaddata /tmp/sites.json
687 0ac84a9a Dimitris Aragiorgis
    snf-manage loaddata /tmp/page.json
688 0ac84a9a Dimitris Aragiorgis
    snf-manage createsuperuser --username=admin --email=admin@{0} --noinput
689 0ac84a9a Dimitris Aragiorgis
    """.format(env.env.domain)
690 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
691 0ac84a9a Dimitris Aragiorgis
692 0ac84a9a Dimitris Aragiorgis
693 0ac84a9a Dimitris Aragiorgis
@roles("cms")
694 0ac84a9a Dimitris Aragiorgis
def setup_cms():
695 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Setting up cms...")
696 0ac84a9a Dimitris Aragiorgis
    if env.cms_pass:
697 0ac84a9a Dimitris Aragiorgis
      debug(env.host, "Aborting. Prerequisites not met.")
698 0ac84a9a Dimitris Aragiorgis
      return
699 0ac84a9a Dimitris Aragiorgis
    with settings(hide("everything")):
700 0ac84a9a Dimitris Aragiorgis
        try_run("ping -c1 accounts." + env.env.domain)
701 0ac84a9a Dimitris Aragiorgis
    setup_gunicorn()
702 0ac84a9a Dimitris Aragiorgis
    setup_apache()
703 0ac84a9a Dimitris Aragiorgis
    setup_webproject()
704 0ac84a9a Dimitris Aragiorgis
    install_package("snf-cloudcms")
705 0ac84a9a Dimitris Aragiorgis
706 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/synnefo/cms.conf"
707 0ac84a9a Dimitris Aragiorgis
    replace = {
708 0ac84a9a Dimitris Aragiorgis
        "ACCOUNTS": env.env.accounts.fqdn,
709 0ac84a9a Dimitris Aragiorgis
        }
710 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
711 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
712 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
713 0ac84a9a Dimitris Aragiorgis
714 0ac84a9a Dimitris Aragiorgis
715 0ac84a9a Dimitris Aragiorgis
    cmd = """
716 0ac84a9a Dimitris Aragiorgis
    snf-manage syncdb
717 0ac84a9a Dimitris Aragiorgis
    snf-manage migrate --delete-ghost-migrations
718 0ac84a9a Dimitris Aragiorgis
    """.format(env.env.domain)
719 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
720 0ac84a9a Dimitris Aragiorgis
721 0ac84a9a Dimitris Aragiorgis
722 0ac84a9a Dimitris Aragiorgis
def setup_nfs_dirs():
723 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Creating NFS mount point for pithos and ganeti...")
724 0ac84a9a Dimitris Aragiorgis
    cmd = """
725 0ac84a9a Dimitris Aragiorgis
    mkdir -p {0}
726 0ac84a9a Dimitris Aragiorgis
    cd {0}
727 0ac84a9a Dimitris Aragiorgis
    mkdir -p data
728 0ac84a9a Dimitris Aragiorgis
    chown www-data:www-data data
729 0ac84a9a Dimitris Aragiorgis
    chmod g+ws data
730 0ac84a9a Dimitris Aragiorgis
    mkdir -p /srv/okeanos
731 0ac84a9a Dimitris Aragiorgis
    """.format(env.env.pithos_dir)
732 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
733 0ac84a9a Dimitris Aragiorgis
734 0ac84a9a Dimitris Aragiorgis
735 0ac84a9a Dimitris Aragiorgis
@roles("nodes")
736 0ac84a9a Dimitris Aragiorgis
def setup_nfs_clients():
737 1d8cf97d Dimitris Aragiorgis
    if env.host == env.env.pithos.ip:
738 0ac84a9a Dimitris Aragiorgis
      return
739 0ac84a9a Dimitris Aragiorgis
740 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Mounting pithos NFS mount point...")
741 0ac84a9a Dimitris Aragiorgis
    with settings(hide("everything")):
742 0ac84a9a Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.pithos.hostname)
743 0ac84a9a Dimitris Aragiorgis
    install_package("nfs-common")
744 0ac84a9a Dimitris Aragiorgis
    for d in [env.env.pithos_dir, "/srv/okeanos"]:
745 0ac84a9a Dimitris Aragiorgis
      try_run("mkdir -p " + d)
746 0ac84a9a Dimitris Aragiorgis
      cmd = """
747 0ac84a9a Dimitris Aragiorgis
      echo "{0}:/{1} {2}  nfs4 defaults,rw,noatime,nodiratime,intr,rsize=1048576,wsize=1048576,noacl" >> /etc/fstab
748 0ac84a9a Dimitris Aragiorgis
      """.format(env.env.pithos.hostname, os.path.basename(d), d)
749 0ac84a9a Dimitris Aragiorgis
      try_run(cmd)
750 0ac84a9a Dimitris Aragiorgis
      try_run("mount " + d)
751 0ac84a9a Dimitris Aragiorgis
752 0ac84a9a Dimitris Aragiorgis
753 0ac84a9a Dimitris Aragiorgis
@roles("pithos")
754 0ac84a9a Dimitris Aragiorgis
def setup_nfs_server():
755 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Setting up NFS server for pithos...")
756 0ac84a9a Dimitris Aragiorgis
    setup_nfs_dirs()
757 0ac84a9a Dimitris Aragiorgis
    install_package("nfs-kernel-server")
758 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/exports"
759 0ac84a9a Dimitris Aragiorgis
    replace = {
760 0ac84a9a Dimitris Aragiorgis
      "pithos_dir": env.env.pithos_dir,
761 0ac84a9a Dimitris Aragiorgis
      "srv": os.path.dirname(env.env.pithos_dir),
762 0ac84a9a Dimitris Aragiorgis
      "subnet": env.env.subnet
763 0ac84a9a Dimitris Aragiorgis
      }
764 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
765 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl)
766 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/nfs-kernel-server restart")
767 0ac84a9a Dimitris Aragiorgis
768 0ac84a9a Dimitris Aragiorgis
769 0ac84a9a Dimitris Aragiorgis
@roles("pithos")
770 0ac84a9a Dimitris Aragiorgis
def setup_pithos():
771 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Setting up snf-pithos-app...")
772 0ac84a9a Dimitris Aragiorgis
    with settings(hide("everything")):
773 0ac84a9a Dimitris Aragiorgis
        try_run("ping -c1 accounts." + env.env.domain)
774 0ac84a9a Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.db.ip)
775 0ac84a9a Dimitris Aragiorgis
    setup_gunicorn()
776 0ac84a9a Dimitris Aragiorgis
    setup_apache()
777 0ac84a9a Dimitris Aragiorgis
    setup_webproject()
778 0ac84a9a Dimitris Aragiorgis
779 1d8cf97d Dimitris Aragiorgis
    with settings(host_string=env.env.accounts.ip):
780 0ac84a9a Dimitris Aragiorgis
        service_id, service_token = get_service_details("pithos")
781 0ac84a9a Dimitris Aragiorgis
782 0ac84a9a Dimitris Aragiorgis
    install_package("kamaki")
783 0ac84a9a Dimitris Aragiorgis
    install_package("snf-pithos-backend")
784 0ac84a9a Dimitris Aragiorgis
    install_package("snf-pithos-app")
785 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/synnefo/pithos.conf"
786 0ac84a9a Dimitris Aragiorgis
    replace = {
787 0ac84a9a Dimitris Aragiorgis
        "ACCOUNTS": env.env.accounts.fqdn,
788 0ac84a9a Dimitris Aragiorgis
        "PITHOS": env.env.pithos.fqdn,
789 0ac84a9a Dimitris Aragiorgis
        "db_node": env.env.db.ip,
790 0ac84a9a Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
791 0ac84a9a Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
792 0ac84a9a Dimitris Aragiorgis
        "pithos_dir": env.env.pithos_dir,
793 0ac84a9a Dimitris Aragiorgis
        "PITHOS_SERVICE_TOKEN": service_token,
794 0ac84a9a Dimitris Aragiorgis
        "proxy": env.env.pithos.hostname == env.env.accounts.hostname
795 0ac84a9a Dimitris Aragiorgis
        }
796 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
797 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
798 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
799 0ac84a9a Dimitris Aragiorgis
800 0ac84a9a Dimitris Aragiorgis
    install_package("snf-pithos-webclient")
801 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/synnefo/webclient.conf"
802 0ac84a9a Dimitris Aragiorgis
    replace = {
803 0ac84a9a Dimitris Aragiorgis
        "ACCOUNTS": env.env.accounts.fqdn,
804 0ac84a9a Dimitris Aragiorgis
        "PITHOS_UI_CLOUDBAR_ACTIVE_SERVICE": service_id,
805 0ac84a9a Dimitris Aragiorgis
        }
806 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
807 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
808 0ac84a9a Dimitris Aragiorgis
809 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
810 0ac84a9a Dimitris Aragiorgis
    #TOFIX: the previous command lets pithos-backend create blocks and maps
811 0ac84a9a Dimitris Aragiorgis
    #       with root owner
812 0ac84a9a Dimitris Aragiorgis
    try_run("chown -R www-data:www-data %s/data " % env.env.pithos_dir)
813 0ac84a9a Dimitris Aragiorgis
    #try_run("pithos-migrate stamp 4c8ccdc58192")
814 0ac84a9a Dimitris Aragiorgis
    #try_run("pithos-migrate upgrade head")
815 0ac84a9a Dimitris Aragiorgis
816 0ac84a9a Dimitris Aragiorgis
817 0ac84a9a Dimitris Aragiorgis
def add_wheezy():
818 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/apt/sources.list.d/wheezy.list"
819 0ac84a9a Dimitris Aragiorgis
    replace = {}
820 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
821 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl)
822 0ac84a9a Dimitris Aragiorgis
    apt_get_update()
823 0ac84a9a Dimitris Aragiorgis
824 0ac84a9a Dimitris Aragiorgis
825 0ac84a9a Dimitris Aragiorgis
def remove_wheezy():
826 0ac84a9a Dimitris Aragiorgis
    try_run("rm -f /etc/apt/sources.list.d/wheezy.list")
827 0ac84a9a Dimitris Aragiorgis
    apt_get_update()
828 0ac84a9a Dimitris Aragiorgis
829 0ac84a9a Dimitris Aragiorgis
830 0ac84a9a Dimitris Aragiorgis
@roles("ganeti")
831 0ac84a9a Dimitris Aragiorgis
def setup_ganeti():
832 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Setting up snf-ganeti...")
833 0ac84a9a Dimitris Aragiorgis
    node_info = env.env.ips_info[env.host]
834 0ac84a9a Dimitris Aragiorgis
    with settings(hide("everything")):
835 0ac84a9a Dimitris Aragiorgis
        #if env.enable_lvm:
836 0ac84a9a Dimitris Aragiorgis
        #    try_run("vgs " + env.env.vg)
837 0ac84a9a Dimitris Aragiorgis
        try_run("getent hosts " + env.env.cluster.fqdn)
838 0ac84a9a Dimitris Aragiorgis
        try_run("getent hosts %s | grep -v ^127" % env.host)
839 0ac84a9a Dimitris Aragiorgis
        try_run("hostname -f | grep " + node_info.fqdn)
840 0ac84a9a Dimitris Aragiorgis
        #try_run("ip link show " + env.env.common_bridge)
841 0ac84a9a Dimitris Aragiorgis
        #try_run("ip link show " + env.env.common_bridge)
842 0ac84a9a Dimitris Aragiorgis
        #try_run("apt-get update")
843 0ac84a9a Dimitris Aragiorgis
    install_package("qemu-kvm")
844 0ac84a9a Dimitris Aragiorgis
    install_package("python-bitarray")
845 0ac84a9a Dimitris Aragiorgis
    add_wheezy()
846 0ac84a9a Dimitris Aragiorgis
    install_package("ganeti-htools")
847 0ac84a9a Dimitris Aragiorgis
    remove_wheezy()
848 0ac84a9a Dimitris Aragiorgis
    install_package("snf-ganeti")
849 0ac84a9a Dimitris Aragiorgis
    try_run("mkdir -p /srv/ganeti/file-storage/")
850 0ac84a9a Dimitris Aragiorgis
    cmd = """
851 0ac84a9a Dimitris Aragiorgis
cat <<EOF > /etc/ganeti/file-storage-paths
852 0ac84a9a Dimitris Aragiorgis
/srv/ganeti/file-storage
853 0ac84a9a Dimitris Aragiorgis
/srv/ganeti/shared-file-storage
854 0ac84a9a Dimitris Aragiorgis
EOF
855 0ac84a9a Dimitris Aragiorgis
"""
856 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
857 0ac84a9a Dimitris Aragiorgis
858 0ac84a9a Dimitris Aragiorgis
859 0ac84a9a Dimitris Aragiorgis
@roles("master")
860 0ac84a9a Dimitris Aragiorgis
def add_rapi_user():
861 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Adding RAPI user to Ganeti backend...")
862 0ac84a9a Dimitris Aragiorgis
    cmd = """
863 0ac84a9a Dimitris Aragiorgis
    echo -n "{0}:Ganeti Remote API:{1}" | openssl md5
864 0ac84a9a Dimitris Aragiorgis
    """.format(env.env.synnefo_user, env.env.synnefo_rapi_passwd)
865 0ac84a9a Dimitris Aragiorgis
    result = try_run(cmd)
866 0ac84a9a Dimitris Aragiorgis
    cmd = """
867 0ac84a9a Dimitris Aragiorgis
    echo "{0} {1}{2} write" >> /var/lib/ganeti/rapi/users
868 0ac84a9a Dimitris Aragiorgis
    """.format(env.env.synnefo_user, '{ha1}',result)
869 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
870 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/ganeti restart")
871 0ac84a9a Dimitris Aragiorgis
872 0ac84a9a Dimitris Aragiorgis
@roles("master")
873 0ac84a9a Dimitris Aragiorgis
def add_nodes():
874 0ac84a9a Dimitris Aragiorgis
    nodes = env.env.cluster_nodes.split(",")
875 0ac84a9a Dimitris Aragiorgis
    nodes.remove(env.env.master_node)
876 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Adding nodes to Ganeti backend...")
877 0ac84a9a Dimitris Aragiorgis
    for n in nodes:
878 0ac84a9a Dimitris Aragiorgis
        add_node(n)
879 0ac84a9a Dimitris Aragiorgis
880 0ac84a9a Dimitris Aragiorgis
@roles("master")
881 0ac84a9a Dimitris Aragiorgis
def add_node(node):
882 0ac84a9a Dimitris Aragiorgis
    node_info = env.env.nodes_info[node]
883 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Adding node %s to Ganeti backend..." % node_info.fqdn)
884 0ac84a9a Dimitris Aragiorgis
    cmd = "gnt-node add --no-ssh-key-check --master-capable=yes --vm-capable=yes " + node_info.fqdn
885 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
886 0ac84a9a Dimitris Aragiorgis
887 0ac84a9a Dimitris Aragiorgis
@roles("ganeti")
888 0ac84a9a Dimitris Aragiorgis
def enable_drbd():
889 0ac84a9a Dimitris Aragiorgis
    if env.enable_drbd:
890 0ac84a9a Dimitris Aragiorgis
        debug(env.host, " * Enabling DRBD...")
891 0ac84a9a Dimitris Aragiorgis
        try_run("modprobe drbd minor_count=255 usermode_helper=/bin/true")
892 0ac84a9a Dimitris Aragiorgis
        try_run("echo drbd minor_count=255 usermode_helper=/bin/true >> /etc/modules")
893 0ac84a9a Dimitris Aragiorgis
894 0ac84a9a Dimitris Aragiorgis
@roles("master")
895 0ac84a9a Dimitris Aragiorgis
def setup_drbd_dparams():
896 0ac84a9a Dimitris Aragiorgis
    if env.enable_drbd:
897 0ac84a9a Dimitris Aragiorgis
        debug(env.host, " * Twicking drbd related disk parameters in Ganeti...")
898 0ac84a9a Dimitris Aragiorgis
        cmd = """
899 0ac84a9a Dimitris Aragiorgis
        gnt-cluster modify --disk-parameters=drbd:metavg={0}
900 0ac84a9a Dimitris Aragiorgis
        gnt-group modify --disk-parameters=drbd:metavg={0} default
901 0ac84a9a Dimitris Aragiorgis
        """.format(env.env.vg)
902 0ac84a9a Dimitris Aragiorgis
        try_run(cmd)
903 0ac84a9a Dimitris Aragiorgis
904 0ac84a9a Dimitris Aragiorgis
@roles("master")
905 0ac84a9a Dimitris Aragiorgis
def enable_lvm():
906 0ac84a9a Dimitris Aragiorgis
    if env.enable_lvm:
907 0ac84a9a Dimitris Aragiorgis
        debug(env.host, " * Enabling LVM...")
908 0ac84a9a Dimitris Aragiorgis
        cmd = """
909 0ac84a9a Dimitris Aragiorgis
        gnt-cluster modify --vg-name={0}
910 0ac84a9a Dimitris Aragiorgis
        """.format(env.env.vg)
911 0ac84a9a Dimitris Aragiorgis
        try_run(cmd)
912 0ac84a9a Dimitris Aragiorgis
    else:
913 0ac84a9a Dimitris Aragiorgis
        debug(env.host, " * Disabling LVM...")
914 0ac84a9a Dimitris Aragiorgis
        try_run("gnt-cluster modify --no-lvm-storage")
915 0ac84a9a Dimitris Aragiorgis
916 0ac84a9a Dimitris Aragiorgis
@roles("master")
917 0ac84a9a Dimitris Aragiorgis
def destroy_cluster():
918 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Destroying Ganeti cluster...")
919 0ac84a9a Dimitris Aragiorgis
    #TODO: remove instances first
920 0ac84a9a Dimitris Aragiorgis
    allnodes = env.env.cluster_hostnames[:]
921 0ac84a9a Dimitris Aragiorgis
    allnodes.remove(env.host)
922 0ac84a9a Dimitris Aragiorgis
    for n in allnodes:
923 0ac84a9a Dimitris Aragiorgis
      host_info = env.env.ips_info[host]
924 0ac84a9a Dimitris Aragiorgis
      debug(env.host, " * Removing node %s..." % n)
925 0ac84a9a Dimitris Aragiorgis
      cmd = "gnt-node remove  " + host_info.fqdn
926 0ac84a9a Dimitris Aragiorgis
      try_run(cmd)
927 0ac84a9a Dimitris Aragiorgis
    try_run("gnt-cluster destroy --yes-do-it")
928 0ac84a9a Dimitris Aragiorgis
929 0ac84a9a Dimitris Aragiorgis
930 0ac84a9a Dimitris Aragiorgis
@roles("master")
931 0ac84a9a Dimitris Aragiorgis
def init_cluster():
932 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Initializing Ganeti backend...")
933 0ac84a9a Dimitris Aragiorgis
    # extra = ""
934 0ac84a9a Dimitris Aragiorgis
    # if env.enable_lvm:
935 0ac84a9a Dimitris Aragiorgis
    #     extra += " --vg-name={0} ".format(env.env.vg)
936 0ac84a9a Dimitris Aragiorgis
    # else:
937 0ac84a9a Dimitris Aragiorgis
    #     extra += " --no-lvm-storage "
938 0ac84a9a Dimitris Aragiorgis
    # if not env.enable_drbd:
939 0ac84a9a Dimitris Aragiorgis
    #     extra += " --no-drbd-storage "
940 0ac84a9a Dimitris Aragiorgis
    extra = " --no-lvm-storage --no-drbd-storage "
941 0ac84a9a Dimitris Aragiorgis
    cmd = """
942 0ac84a9a Dimitris Aragiorgis
    gnt-cluster init --enabled-hypervisors=kvm \
943 0ac84a9a Dimitris Aragiorgis
                     {0} \
944 0ac84a9a Dimitris Aragiorgis
                     --nic-parameters link={1},mode=bridged \
945 0ac84a9a Dimitris Aragiorgis
                     --master-netdev {2} \
946 0ac84a9a Dimitris Aragiorgis
                     --default-iallocator hail \
947 0ac84a9a Dimitris Aragiorgis
                     --hypervisor-parameters kvm:kernel_path=,vnc_bind_address=0.0.0.0 \
948 0ac84a9a Dimitris Aragiorgis
                     --no-ssh-init --no-etc-hosts \
949 0ac84a9a Dimitris Aragiorgis
                    {3}
950 0ac84a9a Dimitris Aragiorgis

951 0ac84a9a Dimitris Aragiorgis
    """.format(extra, env.env.common_bridge,
952 0ac84a9a Dimitris Aragiorgis
               env.env.cluster_netdev, env.env.cluster.fqdn)
953 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
954 0ac84a9a Dimitris Aragiorgis
955 0ac84a9a Dimitris Aragiorgis
956 0ac84a9a Dimitris Aragiorgis
@roles("ganeti")
957 0ac84a9a Dimitris Aragiorgis
def debootstrap():
958 0ac84a9a Dimitris Aragiorgis
    install_package("ganeti-instance-debootstrap")
959 0ac84a9a Dimitris Aragiorgis
960 0ac84a9a Dimitris Aragiorgis
961 0ac84a9a Dimitris Aragiorgis
@roles("ganeti")
962 0ac84a9a Dimitris Aragiorgis
def setup_image_host():
963 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Setting up snf-image...")
964 0ac84a9a Dimitris Aragiorgis
    install_package("snf-pithos-backend")
965 0ac84a9a Dimitris Aragiorgis
    install_package("snf-image")
966 0ac84a9a Dimitris Aragiorgis
    try_run("mkdir -p /srv/okeanos")
967 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/default/snf-image"
968 0ac84a9a Dimitris Aragiorgis
    replace = {
969 0ac84a9a Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
970 0ac84a9a Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
971 0ac84a9a Dimitris Aragiorgis
        "pithos_dir": env.env.pithos_dir,
972 0ac84a9a Dimitris Aragiorgis
        "db_node": env.env.db.ip,
973 0ac84a9a Dimitris Aragiorgis
    }
974 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
975 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl)
976 0ac84a9a Dimitris Aragiorgis
977 0ac84a9a Dimitris Aragiorgis
978 0ac84a9a Dimitris Aragiorgis
@roles("ganeti")
979 0ac84a9a Dimitris Aragiorgis
def setup_image_helper():
980 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Updating helper image...")
981 0ac84a9a Dimitris Aragiorgis
    cmd = """
982 0ac84a9a Dimitris Aragiorgis
    snf-image-update-helper -y
983 0ac84a9a Dimitris Aragiorgis
    """
984 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
985 0ac84a9a Dimitris Aragiorgis
986 0ac84a9a Dimitris Aragiorgis
987 0ac84a9a Dimitris Aragiorgis
@roles("ganeti")
988 0ac84a9a Dimitris Aragiorgis
def setup_gtools():
989 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Setting up snf-cyclades-gtools...")
990 0ac84a9a Dimitris Aragiorgis
    with settings(hide("everything")):
991 0ac84a9a Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.mq.ip)
992 0ac84a9a Dimitris Aragiorgis
    setup_common()
993 0ac84a9a Dimitris Aragiorgis
    install_package("snf-cyclades-gtools")
994 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/synnefo/gtools.conf"
995 0ac84a9a Dimitris Aragiorgis
    replace = {
996 0ac84a9a Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
997 0ac84a9a Dimitris Aragiorgis
        "synnefo_rabbitmq_passwd": env.env.synnefo_rabbitmq_passwd,
998 0ac84a9a Dimitris Aragiorgis
        "mq_node": env.env.mq.ip,
999 0ac84a9a Dimitris Aragiorgis
    }
1000 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
1001 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl)
1002 0ac84a9a Dimitris Aragiorgis
1003 0ac84a9a Dimitris Aragiorgis
    cmd = """
1004 0ac84a9a Dimitris Aragiorgis
    sed -i 's/false/true/' /etc/default/snf-ganeti-eventd
1005 0ac84a9a Dimitris Aragiorgis
    /etc/init.d/snf-ganeti-eventd start
1006 0ac84a9a Dimitris Aragiorgis
    """
1007 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
1008 0ac84a9a Dimitris Aragiorgis
1009 0ac84a9a Dimitris Aragiorgis
1010 0ac84a9a Dimitris Aragiorgis
@roles("ganeti")
1011 0ac84a9a Dimitris Aragiorgis
def setup_iptables():
1012 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Setting up iptables to mangle DHCP requests...")
1013 0ac84a9a Dimitris Aragiorgis
    cmd = """
1014 0ac84a9a Dimitris Aragiorgis
    iptables -t mangle -A PREROUTING -i br+ -p udp -m udp --dport 67 -j NFQUEUE --queue-num 42
1015 0ac84a9a Dimitris Aragiorgis
    iptables -t mangle -A PREROUTING -i tap+ -p udp -m udp --dport 67 -j NFQUEUE --queue-num 42
1016 0ac84a9a Dimitris Aragiorgis
    iptables -t mangle -A PREROUTING -i prv+ -p udp -m udp --dport 67 -j NFQUEUE --queue-num 42
1017 0ac84a9a Dimitris Aragiorgis

1018 0ac84a9a Dimitris Aragiorgis
    ip6tables -t mangle -A PREROUTING -i br+ -p ipv6-icmp -m icmp6 --icmpv6-type 133 -j NFQUEUE --queue-num 43
1019 0ac84a9a Dimitris Aragiorgis
    ip6tables -t mangle -A PREROUTING -i br+ -p ipv6-icmp -m icmp6 --icmpv6-type 135 -j NFQUEUE --queue-num 44
1020 0ac84a9a Dimitris Aragiorgis
    """
1021 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
1022 0ac84a9a Dimitris Aragiorgis
1023 0ac84a9a Dimitris Aragiorgis
@roles("ganeti")
1024 0ac84a9a Dimitris Aragiorgis
def setup_network():
1025 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Setting up networking for Ganeti instances (nfdhcpd, etc.)...")
1026 0ac84a9a Dimitris Aragiorgis
    install_package("nfqueue-bindings-python")
1027 0ac84a9a Dimitris Aragiorgis
    install_package("nfdhcpd")
1028 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/nfdhcpd/nfdhcpd.conf"
1029 0ac84a9a Dimitris Aragiorgis
    replace = {
1030 0ac84a9a Dimitris Aragiorgis
      "ns_node_ip": env.env.ns.ip
1031 0ac84a9a Dimitris Aragiorgis
      }
1032 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
1033 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl)
1034 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/nfdhcpd restart")
1035 0ac84a9a Dimitris Aragiorgis
1036 0ac84a9a Dimitris Aragiorgis
    install_package("snf-network")
1037 0ac84a9a Dimitris Aragiorgis
    cmd = """
1038 0ac84a9a Dimitris Aragiorgis
    sed -i 's/MAC_MASK.*/MAC_MASK = ff:ff:f0:00:00:00/' /etc/default/snf-network
1039 0ac84a9a Dimitris Aragiorgis
    """
1040 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
1041 0ac84a9a Dimitris Aragiorgis
1042 0ac84a9a Dimitris Aragiorgis
1043 0ac84a9a Dimitris Aragiorgis
@roles("router")
1044 0ac84a9a Dimitris Aragiorgis
def setup_router():
1045 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Setting up internal router for NAT...")
1046 0ac84a9a Dimitris Aragiorgis
    cmd = """
1047 0ac84a9a Dimitris Aragiorgis
    echo 1 > /proc/sys/net/ipv4/ip_forward
1048 0ac84a9a Dimitris Aragiorgis
    iptables -t nat -A POSTROUTING -s {0} -o {3} -j MASQUERADE
1049 0ac84a9a Dimitris Aragiorgis
    ip addr add {1} dev {2}
1050 0ac84a9a Dimitris Aragiorgis
    ip route add {0} dev {2} src {1}
1051 0ac84a9a Dimitris Aragiorgis
    """.format(env.env.synnefo_public_network_subnet,
1052 0ac84a9a Dimitris Aragiorgis
               env.env.synnefo_public_network_gateway,
1053 0ac84a9a Dimitris Aragiorgis
               env.env.common_bridge, env.env.public_iface)
1054 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
1055 0ac84a9a Dimitris Aragiorgis
1056 6c51153a Dionysis Grigoropoulos
1057 0ac84a9a Dimitris Aragiorgis
@roles("cyclades")
1058 0ac84a9a Dimitris Aragiorgis
def cyclades_loaddata():
1059 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Loading initial data for cyclades...")
1060 6c51153a Dionysis Grigoropoulos
    try_run("snf-manage flavor-create %s %s %s %s" % (env.env.flavor_cpu,
1061 6c51153a Dionysis Grigoropoulos
                                                      env.env.flavor_ram,
1062 6c51153a Dionysis Grigoropoulos
                                                      env.env.flavor_disk,
1063 6c51153a Dionysis Grigoropoulos
                                                      env.env.flavor_storage))
1064 0ac84a9a Dimitris Aragiorgis
    #run("snf-manage loaddata flavors")
1065 0ac84a9a Dimitris Aragiorgis
1066 0ac84a9a Dimitris Aragiorgis
1067 0ac84a9a Dimitris Aragiorgis
@roles("cyclades")
1068 0ac84a9a Dimitris Aragiorgis
def setup_cyclades():
1069 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Setting up snf-cyclades-app...")
1070 0ac84a9a Dimitris Aragiorgis
    with settings(hide("everything")):
1071 0ac84a9a Dimitris Aragiorgis
        try_run("ping -c1 accounts." + env.env.domain)
1072 0ac84a9a Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.db.ip)
1073 0ac84a9a Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.mq.ip)
1074 0ac84a9a Dimitris Aragiorgis
    setup_gunicorn()
1075 0ac84a9a Dimitris Aragiorgis
    setup_apache()
1076 0ac84a9a Dimitris Aragiorgis
    setup_webproject()
1077 0ac84a9a Dimitris Aragiorgis
    install_package("memcached")
1078 0ac84a9a Dimitris Aragiorgis
    install_package("python-memcache")
1079 0ac84a9a Dimitris Aragiorgis
    install_package("snf-pithos-backend")
1080 0ac84a9a Dimitris Aragiorgis
    install_package("kamaki")
1081 0ac84a9a Dimitris Aragiorgis
    install_package("snf-cyclades-app")
1082 0ac84a9a Dimitris Aragiorgis
    install_package("python-django-south")
1083 0ac84a9a Dimitris Aragiorgis
    tmpl = "/etc/synnefo/cyclades.conf"
1084 0ac84a9a Dimitris Aragiorgis
1085 1d8cf97d Dimitris Aragiorgis
    with settings(host_string=env.env.accounts.ip):
1086 0ac84a9a Dimitris Aragiorgis
        service_id, service_token = get_service_details("cyclades")
1087 0ac84a9a Dimitris Aragiorgis
1088 0ac84a9a Dimitris Aragiorgis
    replace = {
1089 0ac84a9a Dimitris Aragiorgis
        "ACCOUNTS": env.env.accounts.fqdn,
1090 0ac84a9a Dimitris Aragiorgis
        "CYCLADES": env.env.cyclades.fqdn,
1091 0ac84a9a Dimitris Aragiorgis
        "mq_node": env.env.mq.ip,
1092 0ac84a9a Dimitris Aragiorgis
        "db_node": env.env.db.ip,
1093 0ac84a9a Dimitris Aragiorgis
        "synnefo_user": env.env.synnefo_user,
1094 0ac84a9a Dimitris Aragiorgis
        "synnefo_db_passwd": env.env.synnefo_db_passwd,
1095 0ac84a9a Dimitris Aragiorgis
        "synnefo_rabbitmq_passwd": env.env.synnefo_rabbitmq_passwd,
1096 0ac84a9a Dimitris Aragiorgis
        "pithos_dir": env.env.pithos_dir,
1097 0ac84a9a Dimitris Aragiorgis
        "common_bridge": env.env.common_bridge,
1098 0ac84a9a Dimitris Aragiorgis
        "HOST": env.env.cyclades.ip,
1099 0ac84a9a Dimitris Aragiorgis
        "domain": env.env.domain,
1100 0ac84a9a Dimitris Aragiorgis
        "CYCLADES_SERVICE_TOKEN": service_token,
1101 0ac84a9a Dimitris Aragiorgis
        "proxy": env.env.cyclades.hostname == env.env.accounts.hostname
1102 0ac84a9a Dimitris Aragiorgis
        }
1103 0ac84a9a Dimitris Aragiorgis
    custom = customize_settings_from_tmpl(tmpl, replace)
1104 0ac84a9a Dimitris Aragiorgis
    put(custom, tmpl, mode=0644)
1105 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/gunicorn restart")
1106 0ac84a9a Dimitris Aragiorgis
1107 0ac84a9a Dimitris Aragiorgis
    cmd = """
1108 0ac84a9a Dimitris Aragiorgis
    sed -i 's/false/true/' /etc/default/snf-dispatcher
1109 0ac84a9a Dimitris Aragiorgis
    /etc/init.d/snf-dispatcher start
1110 0ac84a9a Dimitris Aragiorgis
    """
1111 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
1112 0ac84a9a Dimitris Aragiorgis
1113 0ac84a9a Dimitris Aragiorgis
    try_run("snf-manage syncdb")
1114 0ac84a9a Dimitris Aragiorgis
    try_run("snf-manage migrate --delete-ghost-migrations")
1115 0ac84a9a Dimitris Aragiorgis
1116 0ac84a9a Dimitris Aragiorgis
1117 0ac84a9a Dimitris Aragiorgis
@roles("cyclades")
1118 0ac84a9a Dimitris Aragiorgis
def get_backend_id(cluster_name="ganeti1.synnefo.deploy.local"):
1119 0ac84a9a Dimitris Aragiorgis
    backend_id = try_run("snf-manage backend-list 2>/dev/null | grep %s | awk '{print $1}'" % cluster_name)
1120 0ac84a9a Dimitris Aragiorgis
    return backend_id
1121 0ac84a9a Dimitris Aragiorgis
1122 0ac84a9a Dimitris Aragiorgis
1123 0ac84a9a Dimitris Aragiorgis
@roles("cyclades")
1124 0ac84a9a Dimitris Aragiorgis
def add_backend():
1125 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "adding %s ganeti backend to cyclades..." % env.env.cluster.fqdn)
1126 0ac84a9a Dimitris Aragiorgis
    with settings(hide("everything")):
1127 0ac84a9a Dimitris Aragiorgis
        try_run("ping -c1 " + env.env.cluster.fqdn)
1128 0ac84a9a Dimitris Aragiorgis
    cmd = """
1129 0ac84a9a Dimitris Aragiorgis
    snf-manage backend-add --clustername={0} --user={1} --pass={2}
1130 0ac84a9a Dimitris Aragiorgis
    """.format(env.env.cluster.fqdn, env.env.synnefo_user,
1131 0ac84a9a Dimitris Aragiorgis
               env.env.synnefo_rapi_passwd)
1132 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
1133 0ac84a9a Dimitris Aragiorgis
    backend_id = get_backend_id(env.env.cluster.fqdn)
1134 0ac84a9a Dimitris Aragiorgis
    try_run("snf-manage backend-modify --drained=False " + backend_id)
1135 0ac84a9a Dimitris Aragiorgis
1136 0ac84a9a Dimitris Aragiorgis
@roles("cyclades")
1137 0ac84a9a Dimitris Aragiorgis
def pin_user_to_backend(user_email):
1138 0ac84a9a Dimitris Aragiorgis
    backend_id = get_backend_id(env.env.cluster.fqdn)
1139 0ac84a9a Dimitris Aragiorgis
    # pin user to backend
1140 0ac84a9a Dimitris Aragiorgis
    cmd = """
1141 0ac84a9a Dimitris Aragiorgis
cat <<EOF >> /etc/synnefo/cyclades.conf
1142 0ac84a9a Dimitris Aragiorgis

1143 0ac84a9a Dimitris Aragiorgis
BACKEND_PER_USER = {
1144 0ac84a9a Dimitris Aragiorgis
  '%s': %s,
1145 0ac84a9a Dimitris Aragiorgis
}
1146 0ac84a9a Dimitris Aragiorgis

1147 0ac84a9a Dimitris Aragiorgis
EOF
1148 0ac84a9a Dimitris Aragiorgis
/etc/init.d/gunicorn restart
1149 0ac84a9a Dimitris Aragiorgis
    """  % (user_email, backend_id)
1150 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
1151 0ac84a9a Dimitris Aragiorgis
1152 0ac84a9a Dimitris Aragiorgis
@roles("cyclades")
1153 0ac84a9a Dimitris Aragiorgis
def add_pools():
1154 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Creating pools of resources (brigdes, mac prefixes) in cyclades...")
1155 0ac84a9a Dimitris Aragiorgis
    try_run("snf-manage pool-create --type=mac-prefix --base=aa:00:0 --size=65536")
1156 0ac84a9a Dimitris Aragiorgis
    try_run("snf-manage pool-create --type=bridge --base=prv --size=20")
1157 0ac84a9a Dimitris Aragiorgis
1158 0ac84a9a Dimitris Aragiorgis
1159 3c626269 Christos Stavrakakis
@roles("accounts", "cyclades", "pithos")
1160 3c626269 Christos Stavrakakis
def export_services():
1161 3c626269 Christos Stavrakakis
    debug(env.host, " * Exporting services...")
1162 3c626269 Christos Stavrakakis
    host = env.host
1163 3c626269 Christos Stavrakakis
    services = []
1164 3c626269 Christos Stavrakakis
    if host == env.env.cyclades.ip:
1165 3c626269 Christos Stavrakakis
        services.append("cyclades")
1166 3c626269 Christos Stavrakakis
    if host == env.env.pithos.ip:
1167 3c626269 Christos Stavrakakis
        services.append("pithos")
1168 3c626269 Christos Stavrakakis
    if host == env.env.accounts.ip:
1169 3c626269 Christos Stavrakakis
        services.append("astakos")
1170 3c626269 Christos Stavrakakis
    for service in services:
1171 3c626269 Christos Stavrakakis
        filename = "%s_services.json" % service
1172 3c626269 Christos Stavrakakis
        cmd = "snf-manage service-export-%s > %s" % (service, filename)
1173 3c626269 Christos Stavrakakis
        run(cmd)
1174 3c626269 Christos Stavrakakis
        get(filename, filename+".local")
1175 3c626269 Christos Stavrakakis
1176 3c626269 Christos Stavrakakis
1177 3c626269 Christos Stavrakakis
@roles("accounts")
1178 3c626269 Christos Stavrakakis
def import_services():
1179 3c626269 Christos Stavrakakis
    debug(env.host, " * Registering services to astakos...")
1180 3c626269 Christos Stavrakakis
    for service in ["cyclades", "pithos", "astakos"]:
1181 3c626269 Christos Stavrakakis
        filename = "%s_services.json" % service
1182 3c626269 Christos Stavrakakis
        put(filename +".local", filename)
1183 3c626269 Christos Stavrakakis
        cmd = "snf-manage service-import --json=%s" % filename
1184 3c626269 Christos Stavrakakis
        run(cmd)
1185 3c626269 Christos Stavrakakis
1186 3c626269 Christos Stavrakakis
    debug(env.host, " * Setting default quota...")
1187 3c626269 Christos Stavrakakis
    cmd = """
1188 3c626269 Christos Stavrakakis
    snf-manage resource-modify --limit 40G pithos.diskspace
1189 3c626269 Christos Stavrakakis
    snf-manage resource-modify --limit 2 astakos.pending_app
1190 3c626269 Christos Stavrakakis
    snf-manage resource-modify --limit 4 cyclades.vm
1191 3c626269 Christos Stavrakakis
    snf-manage resource-modify --limit 40G cyclades.disk
1192 3c626269 Christos Stavrakakis
    snf-manage resource-modify --limit 16G cyclades.ram
1193 3c626269 Christos Stavrakakis
    snf-manage resource-modify --limit 8G cyclades.active_ram
1194 3c626269 Christos Stavrakakis
    snf-manage resource-modify --limit 32 cyclades.cpu
1195 3c626269 Christos Stavrakakis
    snf-manage resource-modify --limit 16 cyclades.active_cpu
1196 3c626269 Christos Stavrakakis
    snf-manage resource-modify --limit 4 cyclades.network.private
1197 3c626269 Christos Stavrakakis
    """
1198 3c626269 Christos Stavrakakis
    try_run(cmd)
1199 3c626269 Christos Stavrakakis
1200 3c626269 Christos Stavrakakis
1201 0ac84a9a Dimitris Aragiorgis
@roles("cyclades")
1202 0ac84a9a Dimitris Aragiorgis
def add_network():
1203 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Adding public network in cyclades...")
1204 0ac84a9a Dimitris Aragiorgis
    backend_id = get_backend_id(env.env.cluster.fqdn)
1205 0ac84a9a Dimitris Aragiorgis
    cmd = """
1206 e86eb5a4 Dimitris Aragiorgis
    snf-manage network-create --subnet={0} --gateway={1} --public --dhcp --flavor={2} --mode=bridged --link={3} --name=Internet --backend-id={4}
1207 0ac84a9a Dimitris Aragiorgis
    """.format(env.env.synnefo_public_network_subnet,
1208 0ac84a9a Dimitris Aragiorgis
               env.env.synnefo_public_network_gateway,
1209 0ac84a9a Dimitris Aragiorgis
               env.env.synnefo_public_network_type,
1210 0ac84a9a Dimitris Aragiorgis
               env.env.common_bridge, backend_id)
1211 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
1212 0ac84a9a Dimitris Aragiorgis
1213 0ac84a9a Dimitris Aragiorgis
1214 0ac84a9a Dimitris Aragiorgis
@roles("cyclades")
1215 0ac84a9a Dimitris Aragiorgis
def setup_vncauthproxy():
1216 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Setting up vncauthproxy...")
1217 0ac84a9a Dimitris Aragiorgis
    install_package("snf-vncauthproxy")
1218 0ac84a9a Dimitris Aragiorgis
    cmd = """
1219 0ac84a9a Dimitris Aragiorgis
    echo CHUID="www-data:nogroup" >> /etc/default/vncauthproxy
1220 0ac84a9a Dimitris Aragiorgis
    rm /var/log/vncauthproxy/vncauthproxy.log
1221 0ac84a9a Dimitris Aragiorgis
    """
1222 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
1223 0ac84a9a Dimitris Aragiorgis
    try_run("/etc/init.d/vncauthproxy restart")
1224 0ac84a9a Dimitris Aragiorgis
1225 0ac84a9a Dimitris Aragiorgis
@roles("client")
1226 0ac84a9a Dimitris Aragiorgis
def setup_kamaki():
1227 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Setting up kamaki client...")
1228 0ac84a9a Dimitris Aragiorgis
    with settings(hide("everything")):
1229 0ac84a9a Dimitris Aragiorgis
        try_run("ping -c1 accounts." + env.env.domain)
1230 0ac84a9a Dimitris Aragiorgis
        try_run("ping -c1 cyclades." + env.env.domain)
1231 0ac84a9a Dimitris Aragiorgis
        try_run("ping -c1 pithos." + env.env.domain)
1232 0ac84a9a Dimitris Aragiorgis
1233 1d8cf97d Dimitris Aragiorgis
    with settings(host_string=env.env.db.ip):
1234 0ac84a9a Dimitris Aragiorgis
        uid, user_auth_token, user_uuid = get_auth_token_from_db(env.env.user_email)
1235 0ac84a9a Dimitris Aragiorgis
1236 0ac84a9a Dimitris Aragiorgis
    install_package("python-progress")
1237 0ac84a9a Dimitris Aragiorgis
    install_package("kamaki")
1238 0ac84a9a Dimitris Aragiorgis
    cmd = """
1239 0ac84a9a Dimitris Aragiorgis
    kamaki config set cloud.default.url "https://{0}/astakos/identity/v2.0/"
1240 0ac84a9a Dimitris Aragiorgis
    kamaki config set cloud.default.token {1}
1241 0ac84a9a Dimitris Aragiorgis
    """.format(env.env.accounts.fqdn, user_auth_token)
1242 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
1243 0ac84a9a Dimitris Aragiorgis
    try_run("kamaki file create images")
1244 0ac84a9a Dimitris Aragiorgis
1245 0ac84a9a Dimitris Aragiorgis
@roles("client")
1246 0ac84a9a Dimitris Aragiorgis
def upload_image(image="debian_base.diskdump"):
1247 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Uploading initial image to pithos...")
1248 0ac84a9a Dimitris Aragiorgis
    image = "debian_base.diskdump"
1249 0ac84a9a Dimitris Aragiorgis
    try_run("wget {0} -O /tmp/{1}".format(env.env.debian_base_url, image))
1250 0ac84a9a Dimitris Aragiorgis
    try_run("kamaki file upload --container images /tmp/{0} {0}".format(image))
1251 0ac84a9a Dimitris Aragiorgis
1252 0ac84a9a Dimitris Aragiorgis
@roles("client")
1253 0ac84a9a Dimitris Aragiorgis
def register_image(image="debian_base.diskdump"):
1254 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Register image to plankton...")
1255 1d8cf97d Dimitris Aragiorgis
    with settings(host_string=env.env.db.ip):
1256 0ac84a9a Dimitris Aragiorgis
        uid, user_auth_token, user_uuid = get_auth_token_from_db(env.env.user_email)
1257 0ac84a9a Dimitris Aragiorgis
1258 83aa2ea5 Ilias Tsitsimpis
    image_location = "images:{0}".format(image)
1259 0ac84a9a Dimitris Aragiorgis
    cmd = """
1260 0ac84a9a Dimitris Aragiorgis
    sleep 5
1261 0ac84a9a Dimitris Aragiorgis
    kamaki image register "Debian Base" {0} --public --disk-format=diskdump --property OSFAMILY=linux --property ROOT_PARTITION=1 --property description="Debian Squeeze Base System" --property size=450M --property kernel=2.6.32 --property GUI="No GUI" --property sortorder=1 --property USERS=root --property OS=debian
1262 83aa2ea5 Ilias Tsitsimpis
    """.format(image_location)
1263 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
1264 0ac84a9a Dimitris Aragiorgis
1265 0ac84a9a Dimitris Aragiorgis
@roles("client")
1266 0ac84a9a Dimitris Aragiorgis
def setup_burnin():
1267 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Setting up burnin testing tool...")
1268 0ac84a9a Dimitris Aragiorgis
    install_package("kamaki")
1269 0ac84a9a Dimitris Aragiorgis
    install_package("snf-tools")
1270 0ac84a9a Dimitris Aragiorgis
1271 0ac84a9a Dimitris Aragiorgis
@roles("pithos")
1272 0ac84a9a Dimitris Aragiorgis
def add_image_locally():
1273 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Getting image locally in order snf-image to use it directly..")
1274 0ac84a9a Dimitris Aragiorgis
    image = "debian_base.diskdump"
1275 0ac84a9a Dimitris Aragiorgis
    try_run("wget {0} -O /srv/okeanos/{1}".format(env.env.debian_base_url, image))
1276 0ac84a9a Dimitris Aragiorgis
1277 0ac84a9a Dimitris Aragiorgis
1278 0ac84a9a Dimitris Aragiorgis
@roles("master")
1279 0ac84a9a Dimitris Aragiorgis
def gnt_instance_add(name="test"):
1280 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Adding test instance to Ganeti...")
1281 0ac84a9a Dimitris Aragiorgis
    osp="""img_passwd=gamwtosecurity,img_format=diskdump,img_id=debian_base,img_properties='{"OSFAMILY":"linux"\,"ROOT_PARTITION":"1"}'"""
1282 0ac84a9a Dimitris Aragiorgis
    cmd = """
1283 0ac84a9a Dimitris Aragiorgis
    gnt-instance add  -o snf-image+default --os-parameters {0} -t plain --disk 0:size=1G --no-name-check --no-ip-check --net 0:ip=pool,network=test --no-install --hypervisor-parameters kvm:machine_version=pc-1.0 {1}
1284 0ac84a9a Dimitris Aragiorgis
    """.format(osp, name)
1285 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
1286 0ac84a9a Dimitris Aragiorgis
1287 0ac84a9a Dimitris Aragiorgis
@roles("master")
1288 0ac84a9a Dimitris Aragiorgis
def gnt_network_add(name="test", subnet="10.0.0.0/26", gw="10.0.0.1", mode="bridged", link="br0"):
1289 0ac84a9a Dimitris Aragiorgis
    debug(env.host, " * Adding test network to Ganeti...")
1290 0ac84a9a Dimitris Aragiorgis
    cmd = """
1291 0ac84a9a Dimitris Aragiorgis
    gnt-network add --network={1} --gateway={2} {0}
1292 0ac84a9a Dimitris Aragiorgis
    gnt-network connect {0} {3} {4}
1293 0ac84a9a Dimitris Aragiorgis
    """.format(name, subnet, gw, mode, link)
1294 0ac84a9a Dimitris Aragiorgis
    try_run(cmd)
1295 0ac84a9a Dimitris Aragiorgis
1296 0ac84a9a Dimitris Aragiorgis
@roles("ips")
1297 0ac84a9a Dimitris Aragiorgis
def test():
1298 0ac84a9a Dimitris Aragiorgis
    debug(env.host, "Testing...")
1299 0ac84a9a Dimitris Aragiorgis
    try_run("hostname && date")