Statistics
| Branch: | Tag: | Revision:

root / snf-deploy / snfdeploy / __init__.py @ 4a769fc0

History | View | Annotate | Download (20 kB)

1 0ac84a9a Dimitris Aragiorgis
import time
2 0ac84a9a Dimitris Aragiorgis
import os
3 0ac84a9a Dimitris Aragiorgis
import argparse
4 0ac84a9a Dimitris Aragiorgis
import sys
5 0ac84a9a Dimitris Aragiorgis
import re
6 0ac84a9a Dimitris Aragiorgis
import random
7 0ac84a9a Dimitris Aragiorgis
import ast
8 ca1de37b Ilias Tsitsimpis
from snfdeploy.lib import check_pidfile, create_dir, get_default_route, \
9 ca1de37b Ilias Tsitsimpis
    random_mac, Conf, Env
10 3bae85da Dimitris Aragiorgis
from snfdeploy import fabfile
11 ca1de37b Ilias Tsitsimpis
from fabric.api import hide, settings, execute, show
12 ca1de37b Ilias Tsitsimpis
13 0ac84a9a Dimitris Aragiorgis
14 0ac84a9a Dimitris Aragiorgis
def print_available_actions(command):
15 0ac84a9a Dimitris Aragiorgis
16 ca1de37b Ilias Tsitsimpis
    if command == "keygen":
17 ca1de37b Ilias Tsitsimpis
        print """
18 4b36944e Ilias Tsitsimpis
Usage: snf-deploy keygen [--force]
19 4b36944e Ilias Tsitsimpis

20 4b36944e Ilias Tsitsimpis
  Generate new ssh keys (both rsa and dsa keypairs)
21 4b36944e Ilias Tsitsimpis

22 4b36944e Ilias Tsitsimpis
  """
23 4b36944e Ilias Tsitsimpis
24 ca1de37b Ilias Tsitsimpis
    if command == "vcluster":
25 ca1de37b Ilias Tsitsimpis
        print """
26 0ac84a9a Dimitris Aragiorgis
Usage: snf-deploy vcluster
27 0ac84a9a Dimitris Aragiorgis

28 0ac84a9a Dimitris Aragiorgis
  Run the following actions concerning the local virtual cluster:
29 0ac84a9a Dimitris Aragiorgis

30 ca1de37b Ilias Tsitsimpis
    - Download base image and create additional disk \
31 ca1de37b Ilias Tsitsimpis
(if --create-extra-disk is passed)
32 0ac84a9a Dimitris Aragiorgis
    - Does all the network related actions (bridge, iptables, NAT)
33 0ac84a9a Dimitris Aragiorgis
    - Launches dnsmasq for dhcp server on bridge
34 0ac84a9a Dimitris Aragiorgis
    - Creates the virtual cluster (with kvm)
35 0ac84a9a Dimitris Aragiorgis

36 0ac84a9a Dimitris Aragiorgis
  """
37 0ac84a9a Dimitris Aragiorgis
38 ca1de37b Ilias Tsitsimpis
    if command == "prepare":
39 ca1de37b Ilias Tsitsimpis
        print """
40 0ac84a9a Dimitris Aragiorgis
Usage: snf-deploy prepare
41 0ac84a9a Dimitris Aragiorgis

42 0ac84a9a Dimitris Aragiorgis
  Run the following actions concerning deployment preparation:
43 0ac84a9a Dimitris Aragiorgis

44 0ac84a9a Dimitris Aragiorgis
    - Setup an internal Domain Name Server
45 0ac84a9a Dimitris Aragiorgis
    - Tweak hosts and add ssh keys
46 0ac84a9a Dimitris Aragiorgis
    - Check network setup
47 0ac84a9a Dimitris Aragiorgis
    - Setup apt repository and apt-get update
48 0ac84a9a Dimitris Aragiorgis
    - Setup the nfs server and clients among all nodes
49 0ac84a9a Dimitris Aragiorgis

50 0ac84a9a Dimitris Aragiorgis
  """
51 0ac84a9a Dimitris Aragiorgis
52 ca1de37b Ilias Tsitsimpis
    if command == "backend":
53 ca1de37b Ilias Tsitsimpis
        print """
54 0ac84a9a Dimitris Aragiorgis
Usage: snf-deploy backend [update]
55 0ac84a9a Dimitris Aragiorgis

56 0ac84a9a Dimitris Aragiorgis
  Run the following actions concerning a ganeti backend:
57 0ac84a9a Dimitris Aragiorgis

58 0ac84a9a Dimitris Aragiorgis
    - Create and add a backend to cyclades
59 0ac84a9a Dimitris Aragiorgis
    - Does all the net-infra specific actions in backend nodes
60 0ac84a9a Dimitris Aragiorgis
      (create/connect bridges, iptables..)
61 0ac84a9a Dimitris Aragiorgis
    - Does all the storage-infra specific actions in backend nodes
62 ca1de37b Ilias Tsitsimpis
      depending on the --extra-disk option \
63 ca1de37b Ilias Tsitsimpis
(create VG, enable lvm/drbd storage..)
64 0ac84a9a Dimitris Aragiorgis

65 0ac84a9a Dimitris Aragiorgis
    or
66 0ac84a9a Dimitris Aragiorgis

67 0ac84a9a Dimitris Aragiorgis
    - Update packages in an already registered backend in cyclades.
68 0ac84a9a Dimitris Aragiorgis

69 0ac84a9a Dimitris Aragiorgis
  """
70 0ac84a9a Dimitris Aragiorgis
71 ca1de37b Ilias Tsitsimpis
    if command == "run":
72 ca1de37b Ilias Tsitsimpis
        print """
73 0ac84a9a Dimitris Aragiorgis
Usage: snf-deploy run <action> [<action>...]
74 0ac84a9a Dimitris Aragiorgis

75 0ac84a9a Dimitris Aragiorgis
  Run any of the following fabric commands:
76 0ac84a9a Dimitris Aragiorgis

77 0ac84a9a Dimitris Aragiorgis

78 0ac84a9a Dimitris Aragiorgis
    Setup commands:        Init commands:                Admin commands:
79 0ac84a9a Dimitris Aragiorgis
      setup_apache           add_pools                     activate_user
80 0ac84a9a Dimitris Aragiorgis
      setup_apt              add_rapi_user                 add_backend
81 0ac84a9a Dimitris Aragiorgis
      setup_astakos          add_nodes                     add_image_locally
82 0ac84a9a Dimitris Aragiorgis
      setup_cms              astakos_loaddata              add_network
83 3c626269 Christos Stavrakakis
      setup_common           astakos_register_components   add_ns
84 0ac84a9a Dimitris Aragiorgis
      setup_cyclades         cms_loaddata                  add_user
85 0ac84a9a Dimitris Aragiorgis
      setup_db               cyclades_loaddata             connect_bridges
86 0ac84a9a Dimitris Aragiorgis
      setup_ganeti           enable_drbd                   create_bridges
87 0ac84a9a Dimitris Aragiorgis
      setup_gtools           init_cluster                  create_vlans
88 0ac84a9a Dimitris Aragiorgis
      setup_gunicorn         setup_nfs_clients             destroy_db
89 ca1de37b Ilias Tsitsimpis
      setup_hosts            setup_nfs_server              \
90 ca1de37b Ilias Tsitsimpis
get_auth_token_from_db
91 0ac84a9a Dimitris Aragiorgis
      setup_image_helper     update_ns_for_ganeti          get_service_details
92 0ac84a9a Dimitris Aragiorgis
      setup_image_host                                     gnt_instance_add
93 0ac84a9a Dimitris Aragiorgis
      setup_iptables                                       gnt_network_add
94 0ac84a9a Dimitris Aragiorgis
      setup_kamaki         Test commands:                  register_image
95 0ac84a9a Dimitris Aragiorgis
      setup_lvm              test                          restart_services
96 0ac84a9a Dimitris Aragiorgis
      setup_mq                                             setup_drbd_dparams
97 0ac84a9a Dimitris Aragiorgis
      setup_net_infra
98 0ac84a9a Dimitris Aragiorgis
      setup_network
99 0ac84a9a Dimitris Aragiorgis
      setup_ns
100 0ac84a9a Dimitris Aragiorgis
      setup_pithos
101 0ac84a9a Dimitris Aragiorgis
      setup_pithos_dir
102 0ac84a9a Dimitris Aragiorgis
      setup_router
103 0ac84a9a Dimitris Aragiorgis
      setup_vncauthproxy
104 0ac84a9a Dimitris Aragiorgis
      setup_webproject
105 0ac84a9a Dimitris Aragiorgis

106 0ac84a9a Dimitris Aragiorgis
  """
107 0ac84a9a Dimitris Aragiorgis
108 ca1de37b Ilias Tsitsimpis
    sys.exit(1)
109 0ac84a9a Dimitris Aragiorgis
110 0ac84a9a Dimitris Aragiorgis
111 0ac84a9a Dimitris Aragiorgis
def create_dnsmasq_files(args, env):
112 0ac84a9a Dimitris Aragiorgis
113 ca1de37b Ilias Tsitsimpis
    print("Customize dnsmasq..")
114 ca1de37b Ilias Tsitsimpis
    out = env.dns
115 0ac84a9a Dimitris Aragiorgis
116 ca1de37b Ilias Tsitsimpis
    hostsfile = open(out + "/dhcp-hostsfile", "w")
117 ca1de37b Ilias Tsitsimpis
    optsfile = open(out + "/dhcp-optsfile", "w")
118 ca1de37b Ilias Tsitsimpis
    conffile = open(out + "/conf-file", "w")
119 0ac84a9a Dimitris Aragiorgis
120 ca1de37b Ilias Tsitsimpis
    for node, info in env.nodes_info.iteritems():
121 ca1de37b Ilias Tsitsimpis
        # serve ip and hostname to nodes
122 ca1de37b Ilias Tsitsimpis
        hostsfile.write("%s,%s,%s,2m\n" % (info.mac, info.ip, info.hostname))
123 0ac84a9a Dimitris Aragiorgis
124 ca1de37b Ilias Tsitsimpis
    hostsfile.write("52:54:56:*:*:*,ignore\n")
125 0ac84a9a Dimitris Aragiorgis
126 ca1de37b Ilias Tsitsimpis
    # Netmask
127 ca1de37b Ilias Tsitsimpis
    optsfile.write("1,%s\n" % env.net.netmask)
128 ca1de37b Ilias Tsitsimpis
    # Gateway
129 ca1de37b Ilias Tsitsimpis
    optsfile.write("3,%s\n" % env.gateway)
130 ca1de37b Ilias Tsitsimpis
    # Namesevers
131 ca1de37b Ilias Tsitsimpis
    optsfile.write("6,%s\n" % "8.8.8.8")
132 0ac84a9a Dimitris Aragiorgis
133 ca1de37b Ilias Tsitsimpis
    dnsconf = """
134 0ac84a9a Dimitris Aragiorgis
user=dnsmasq
135 0ac84a9a Dimitris Aragiorgis
bogus-priv
136 0ac84a9a Dimitris Aragiorgis
no-poll
137 0ac84a9a Dimitris Aragiorgis
no-negcache
138 0ac84a9a Dimitris Aragiorgis
leasefile-ro
139 0ac84a9a Dimitris Aragiorgis
bind-interfaces
140 0ac84a9a Dimitris Aragiorgis
except-interface=lo
141 0ac84a9a Dimitris Aragiorgis
dhcp-fqdn
142 0ac84a9a Dimitris Aragiorgis
no-resolv
143 0ac84a9a Dimitris Aragiorgis
# disable DNS
144 0ac84a9a Dimitris Aragiorgis
port=0
145 0ac84a9a Dimitris Aragiorgis
""".format(env.ns.ip)
146 0ac84a9a Dimitris Aragiorgis
147 ca1de37b Ilias Tsitsimpis
    dnsconf += """
148 0ac84a9a Dimitris Aragiorgis
# serve domain and search domain for resolv.conf
149 0ac84a9a Dimitris Aragiorgis
domain={5}
150 0ac84a9a Dimitris Aragiorgis
interface={0}
151 0ac84a9a Dimitris Aragiorgis
dhcp-hostsfile={1}
152 0ac84a9a Dimitris Aragiorgis
dhcp-optsfile={2}
153 0ac84a9a Dimitris Aragiorgis
dhcp-range={0},{4},static,2m
154 0ac84a9a Dimitris Aragiorgis
""".format(env.bridge, hostsfile.name, optsfile.name,
155 0ac84a9a Dimitris Aragiorgis
           env.domain, env.net.network, env.domain)
156 0ac84a9a Dimitris Aragiorgis
157 ca1de37b Ilias Tsitsimpis
    conffile.write(dnsconf)
158 0ac84a9a Dimitris Aragiorgis
159 ca1de37b Ilias Tsitsimpis
    hostsfile.close()
160 ca1de37b Ilias Tsitsimpis
    optsfile.close()
161 ca1de37b Ilias Tsitsimpis
    conffile.close()
162 0ac84a9a Dimitris Aragiorgis
163 0ac84a9a Dimitris Aragiorgis
164 0ac84a9a Dimitris Aragiorgis
def cleanup(args, env):
165 ca1de37b Ilias Tsitsimpis
    print("Cleaning up bridge, NAT, resolv.conf...")
166 ca1de37b Ilias Tsitsimpis
167 ca1de37b Ilias Tsitsimpis
    for f in os.listdir(env.run):
168 ca1de37b Ilias Tsitsimpis
        if re.search(".pid$", f):
169 ca1de37b Ilias Tsitsimpis
            check_pidfile(os.path.join(env.run, f))
170 ca1de37b Ilias Tsitsimpis
171 ca1de37b Ilias Tsitsimpis
    create_dir(env.run, True)
172 ca1de37b Ilias Tsitsimpis
    # create_dir(env.cmd, True)
173 ca1de37b Ilias Tsitsimpis
    cmd = """
174 ca1de37b Ilias Tsitsimpis
    iptables -t nat -D POSTROUTING -s {0} -o {1} -j MASQUERADE
175 ca1de37b Ilias Tsitsimpis
    echo 0 > /proc/sys/net/ipv4/ip_forward
176 ca1de37b Ilias Tsitsimpis
    iptables -D INPUT -i {2} -j ACCEPT
177 ca1de37b Ilias Tsitsimpis
    iptables -D FORWARD -i {2} -j ACCEPT
178 ca1de37b Ilias Tsitsimpis
    iptables -D OUTPUT -o {2} -j ACCEPT
179 ca1de37b Ilias Tsitsimpis
    """.format(env.subnet, get_default_route()[1], env.bridge)
180 ca1de37b Ilias Tsitsimpis
    os.system(cmd)
181 ca1de37b Ilias Tsitsimpis
182 ca1de37b Ilias Tsitsimpis
    cmd = """
183 ca1de37b Ilias Tsitsimpis
    ip link show {0} && ip addr del {1}/{2} dev {0}
184 ca1de37b Ilias Tsitsimpis
    sleep 1
185 ca1de37b Ilias Tsitsimpis
    ip link set {0} down
186 ca1de37b Ilias Tsitsimpis
    sleep 1
187 ca1de37b Ilias Tsitsimpis
    brctl delbr {0}
188 ca1de37b Ilias Tsitsimpis
    """.format(env.bridge, env.gateway, env.net.prefixlen)
189 ca1de37b Ilias Tsitsimpis
    os.system(cmd)
190 0ac84a9a Dimitris Aragiorgis
191 0ac84a9a Dimitris Aragiorgis
192 0ac84a9a Dimitris Aragiorgis
def network(args, env):
193 ca1de37b Ilias Tsitsimpis
    print("Create bridge..Add gateway IP..Activate NAT.."
194 ca1de37b Ilias Tsitsimpis
          "Append NS options to resolv.conf")
195 ca1de37b Ilias Tsitsimpis
196 ca1de37b Ilias Tsitsimpis
    cmd = """
197 ca1de37b Ilias Tsitsimpis
    ! ip link show {0} && brctl addbr {0} && ip link set {0} up
198 ca1de37b Ilias Tsitsimpis
    sleep 1
199 ca1de37b Ilias Tsitsimpis
    ip link set promisc on dev {0}
200 ca1de37b Ilias Tsitsimpis
    ip addr add {1}/{2} dev {0}
201 ca1de37b Ilias Tsitsimpis
    """.format(env.bridge, env.gateway, env.net.prefixlen)
202 ca1de37b Ilias Tsitsimpis
    os.system(cmd)
203 ca1de37b Ilias Tsitsimpis
204 ca1de37b Ilias Tsitsimpis
    cmd = """
205 ca1de37b Ilias Tsitsimpis
    iptables -t nat -A POSTROUTING -s {0} -o {1} -j MASQUERADE
206 ca1de37b Ilias Tsitsimpis
    echo 1 > /proc/sys/net/ipv4/ip_forward
207 ca1de37b Ilias Tsitsimpis
    iptables -I INPUT 1 -i {2} -j ACCEPT
208 ca1de37b Ilias Tsitsimpis
    iptables -I FORWARD 1 -i {2} -j ACCEPT
209 ca1de37b Ilias Tsitsimpis
    iptables -I OUTPUT 1 -o {2} -j ACCEPT
210 ca1de37b Ilias Tsitsimpis
    """.format(env.subnet, get_default_route()[1], env.bridge)
211 ca1de37b Ilias Tsitsimpis
    os.system(cmd)
212 0ac84a9a Dimitris Aragiorgis
213 0ac84a9a Dimitris Aragiorgis
214 0ac84a9a Dimitris Aragiorgis
def image(args, env):
215 ca1de37b Ilias Tsitsimpis
    if env.os == "ubuntu":
216 ca1de37b Ilias Tsitsimpis
        url = env.ubuntu_image_url
217 ca1de37b Ilias Tsitsimpis
    else:
218 ca1de37b Ilias Tsitsimpis
        url = env.squeeze_image_url
219 0ac84a9a Dimitris Aragiorgis
220 ca1de37b Ilias Tsitsimpis
    disk0 = "{0}/{1}.disk0".format(env.images, env.os)
221 ca1de37b Ilias Tsitsimpis
    disk1 = "{0}/{1}.disk1".format(env.images, env.os)
222 0ac84a9a Dimitris Aragiorgis
223 ca1de37b Ilias Tsitsimpis
    if url and not os.path.exists(disk0):
224 ca1de37b Ilias Tsitsimpis
        cmd = "wget {0} -O {1}".format(url, disk0)
225 ca1de37b Ilias Tsitsimpis
        os.system(cmd)
226 0ac84a9a Dimitris Aragiorgis
227 ca1de37b Ilias Tsitsimpis
    if ast.literal_eval(env.create_extra_disk) and not os.path.exists(disk1):
228 ca1de37b Ilias Tsitsimpis
        if env.lvg:
229 ca1de37b Ilias Tsitsimpis
            cmd = "lvcreate -L30G -n{0}.disk1 {1}".format(env.os, env.lvg)
230 ca1de37b Ilias Tsitsimpis
            os.system(cmd)
231 ca1de37b Ilias Tsitsimpis
            cmd = "ln -s /dev/{0}/{1}.disk1 {2}".format(env.lvg, env.os, disk1)
232 ca1de37b Ilias Tsitsimpis
            os.system(cmd)
233 ca1de37b Ilias Tsitsimpis
        else:
234 ca1de37b Ilias Tsitsimpis
            cmd = "dd if=/dev/zero of={0} bs=10M count=3000".format(disk1)
235 ca1de37b Ilias Tsitsimpis
            os.system(cmd)
236 0ac84a9a Dimitris Aragiorgis
237 0ac84a9a Dimitris Aragiorgis
238 0ac84a9a Dimitris Aragiorgis
def fabcommand(args, env, actions, nodes=[]):
239 ca1de37b Ilias Tsitsimpis
    levels = ["status", "aborts", "warnings", "running",
240 ca1de37b Ilias Tsitsimpis
              "stdout", "stderr", "user", "debug"]
241 0ac84a9a Dimitris Aragiorgis
242 ca1de37b Ilias Tsitsimpis
    level_aliases = {
243 ca1de37b Ilias Tsitsimpis
        "output": ["stdout", "stderr"],
244 ca1de37b Ilias Tsitsimpis
        "everything": ["warnings", "running", "user", "output"]
245 0ac84a9a Dimitris Aragiorgis
    }
246 0ac84a9a Dimitris Aragiorgis
247 ca1de37b Ilias Tsitsimpis
    lhide = level_aliases["everything"]
248 ca1de37b Ilias Tsitsimpis
    lshow = []
249 0ac84a9a Dimitris Aragiorgis
250 ca1de37b Ilias Tsitsimpis
    if args.verbose == 1:
251 ca1de37b Ilias Tsitsimpis
        lshow = levels[:3]
252 ca1de37b Ilias Tsitsimpis
        lhide = levels[3:]
253 ca1de37b Ilias Tsitsimpis
    elif args.verbose == 2:
254 ca1de37b Ilias Tsitsimpis
        lshow = levels[:4]
255 ca1de37b Ilias Tsitsimpis
        lhide = levels[4:]
256 ca1de37b Ilias Tsitsimpis
    elif args.verbose >= 3 or args.debug:
257 ca1de37b Ilias Tsitsimpis
        lshow = levels
258 ca1de37b Ilias Tsitsimpis
        lhide = []
259 0ac84a9a Dimitris Aragiorgis
260 3bae85da Dimitris Aragiorgis
#   fabcmd += " --fabfile {4}/fabfile.py \
261 3bae85da Dimitris Aragiorgis
# setup_env:confdir={0},packages={1},templates={2},cluster_name={3},\
262 3bae85da Dimitris Aragiorgis
# autoconf={5},disable_colors={6},key_inject={7} \
263 3bae85da Dimitris Aragiorgis
# ".format(args.confdir, env.packages, env.templates, args.cluster_name,
264 3bae85da Dimitris Aragiorgis
#          env.lib, args.autoconf, args.disable_colors, args.key_inject)
265 0ac84a9a Dimitris Aragiorgis
266 ca1de37b Ilias Tsitsimpis
    if nodes:
267 ca1de37b Ilias Tsitsimpis
        ips = [env.nodes_info[n].ip for n in nodes]
268 0ac84a9a Dimitris Aragiorgis
269 ca1de37b Ilias Tsitsimpis
    fabfile.setup_env(args)
270 ca1de37b Ilias Tsitsimpis
    with settings(hide(*lhide), show(*lshow)):
271 ca1de37b Ilias Tsitsimpis
        print " ".join(actions)
272 ca1de37b Ilias Tsitsimpis
        for a in actions:
273 ca1de37b Ilias Tsitsimpis
            fn = getattr(fabfile, a)
274 ca1de37b Ilias Tsitsimpis
            if not args.dry_run:
275 ca1de37b Ilias Tsitsimpis
                if nodes:
276 ca1de37b Ilias Tsitsimpis
                    execute(fn, hosts=ips)
277 ca1de37b Ilias Tsitsimpis
                else:
278 ca1de37b Ilias Tsitsimpis
                    execute(fn)
279 0ac84a9a Dimitris Aragiorgis
280 0ac84a9a Dimitris Aragiorgis
281 0ac84a9a Dimitris Aragiorgis
def cluster(args, env):
282 ca1de37b Ilias Tsitsimpis
    for hostname, mac in env.node2mac.iteritems():
283 ca1de37b Ilias Tsitsimpis
        launch_vm(args, env, hostname, mac)
284 0ac84a9a Dimitris Aragiorgis
285 ca1de37b Ilias Tsitsimpis
    time.sleep(30)
286 ca1de37b Ilias Tsitsimpis
    os.system("reset")
287 0ac84a9a Dimitris Aragiorgis
288 0ac84a9a Dimitris Aragiorgis
289 0ac84a9a Dimitris Aragiorgis
def launch_vm(args, env, hostname, mac):
290 ca1de37b Ilias Tsitsimpis
    check_pidfile("%s/%s.pid" % (env.run, hostname))
291 0ac84a9a Dimitris Aragiorgis
292 ca1de37b Ilias Tsitsimpis
    print("Launching cluster node {0}..".format(hostname))
293 ca1de37b Ilias Tsitsimpis
    os.environ["BRIDGE"] = env.bridge
294 ca1de37b Ilias Tsitsimpis
    if args.vnc:
295 ca1de37b Ilias Tsitsimpis
        graphics = "-vnc :{0}".format(random.randint(1, 1000))
296 ca1de37b Ilias Tsitsimpis
    else:
297 ca1de37b Ilias Tsitsimpis
        graphics = "-nographic"
298 0ac84a9a Dimitris Aragiorgis
299 ca1de37b Ilias Tsitsimpis
    disks = """ \
300 0ac84a9a Dimitris Aragiorgis
-drive file={0}/{1}.disk0,format=raw,if=none,id=drive0,snapshot=on \
301 0ac84a9a Dimitris Aragiorgis
-device virtio-blk-pci,drive=drive0,id=virtio-blk-pci.0 \
302 ca1de37b Ilias Tsitsimpis
""".format(env.images, env.os)
303 0ac84a9a Dimitris Aragiorgis
304 ca1de37b Ilias Tsitsimpis
    if ast.literal_eval(env.create_extra_disk):
305 ca1de37b Ilias Tsitsimpis
        disks += """ \
306 0ac84a9a Dimitris Aragiorgis
-drive file={0}/{1}.disk1,format=raw,if=none,id=drive1,snapshot=on \
307 0ac84a9a Dimitris Aragiorgis
-device virtio-blk-pci,drive=drive1,id=virtio-blk-pci.1 \
308 ca1de37b Ilias Tsitsimpis
""".format(env.images, env.os)
309 0ac84a9a Dimitris Aragiorgis
310 ca1de37b Ilias Tsitsimpis
    ifup = env.lib + "/ifup"
311 ca1de37b Ilias Tsitsimpis
    nics = """ \
312 0ac84a9a Dimitris Aragiorgis
-netdev tap,id=netdev0,script={0},downscript=no \
313 0ac84a9a Dimitris Aragiorgis
-device virtio-net-pci,mac={1},netdev=netdev0,id=virtio-net-pci.0 \
314 0ac84a9a Dimitris Aragiorgis
-netdev tap,id=netdev1,script={0},downscript=no \
315 0ac84a9a Dimitris Aragiorgis
-device virtio-net-pci,mac={2},netdev=netdev1,id=virtio-net-pci.1 \
316 0ac84a9a Dimitris Aragiorgis
-netdev tap,id=netdev2,script={0},downscript=no \
317 0ac84a9a Dimitris Aragiorgis
-device virtio-net-pci,mac={3},netdev=netdev2,id=virtio-net-pci.2 \
318 ca1de37b Ilias Tsitsimpis
""".format(ifup, mac, random_mac(), random_mac())
319 0ac84a9a Dimitris Aragiorgis
320 ca1de37b Ilias Tsitsimpis
    cmd = """
321 0ac84a9a Dimitris Aragiorgis
/usr/bin/kvm -name {0} -pidfile {1}/{0}.pid -balloon virtio -daemonize \
322 0ac84a9a Dimitris Aragiorgis
-monitor unix:{1}/{0}.monitor,server,nowait -usbdevice tablet -boot c \
323 0ac84a9a Dimitris Aragiorgis
{2} \
324 0ac84a9a Dimitris Aragiorgis
{3} \
325 0ac84a9a Dimitris Aragiorgis
-m {4} -smp {5} {6} \
326 ca1de37b Ilias Tsitsimpis
""".format(hostname, env.run, disks, nics, args.mem, args.smp, graphics)
327 ca1de37b Ilias Tsitsimpis
    print cmd
328 ca1de37b Ilias Tsitsimpis
    os.system(cmd)
329 0ac84a9a Dimitris Aragiorgis
330 0ac84a9a Dimitris Aragiorgis
331 0ac84a9a Dimitris Aragiorgis
def dnsmasq(args, env):
332 ca1de37b Ilias Tsitsimpis
    check_pidfile(env.run + "/dnsmasq.pid")
333 ca1de37b Ilias Tsitsimpis
    cmd = "dnsmasq --pid-file={0}/dnsmasq.pid --conf-file={1}/conf-file"\
334 ca1de37b Ilias Tsitsimpis
        .format(env.run, env.dns)
335 ca1de37b Ilias Tsitsimpis
    os.system(cmd)
336 0ac84a9a Dimitris Aragiorgis
337 0ac84a9a Dimitris Aragiorgis
338 0ac84a9a Dimitris Aragiorgis
def get_packages(args, env):
339 ca1de37b Ilias Tsitsimpis
    if env.package_url:
340 ca1de37b Ilias Tsitsimpis
        os.system("rm {0}/*.deb".format(env.packages))
341 ca1de37b Ilias Tsitsimpis
        os.system("wget -r --level=1 -nH --no-parent --cut-dirs=4 {0} -P {1}"
342 ca1de37b Ilias Tsitsimpis
                  .format(env.package_url, env.packages))
343 0ac84a9a Dimitris Aragiorgis
344 0ac84a9a Dimitris Aragiorgis
345 0ac84a9a Dimitris Aragiorgis
def parse_options():
346 ca1de37b Ilias Tsitsimpis
    parser = argparse.ArgumentParser()
347 ca1de37b Ilias Tsitsimpis
348 ca1de37b Ilias Tsitsimpis
    # Directories to load/store config
349 ca1de37b Ilias Tsitsimpis
    parser.add_argument("-c", dest="confdir",
350 ca1de37b Ilias Tsitsimpis
                        default="/etc/snf-deploy",
351 ca1de37b Ilias Tsitsimpis
                        help="Directory to find default configuration")
352 ca1de37b Ilias Tsitsimpis
    parser.add_argument("--dry-run", dest="dry_run",
353 ca1de37b Ilias Tsitsimpis
                        default=False, action="store_true",
354 ca1de37b Ilias Tsitsimpis
                        help="Do not execute or write anything.")
355 ca1de37b Ilias Tsitsimpis
    parser.add_argument("-v", dest="verbose",
356 ca1de37b Ilias Tsitsimpis
                        default=0, action="count",
357 ca1de37b Ilias Tsitsimpis
                        help="Increase verbosity.")
358 ca1de37b Ilias Tsitsimpis
    parser.add_argument("-d", dest="debug",
359 ca1de37b Ilias Tsitsimpis
                        default=False, action="store_true",
360 ca1de37b Ilias Tsitsimpis
                        help="Debug mode")
361 ca1de37b Ilias Tsitsimpis
    parser.add_argument("--autoconf", dest="autoconf",
362 ca1de37b Ilias Tsitsimpis
                        default=False, action="store_true",
363 ca1de37b Ilias Tsitsimpis
                        help="In case of all in one auto conf setup")
364 ca1de37b Ilias Tsitsimpis
365 ca1de37b Ilias Tsitsimpis
    # virtual cluster related options
366 ca1de37b Ilias Tsitsimpis
    parser.add_argument("--mem", dest="mem",
367 ca1de37b Ilias Tsitsimpis
                        default=2024,
368 ca1de37b Ilias Tsitsimpis
                        help="Memory for every virutal node")
369 ca1de37b Ilias Tsitsimpis
    parser.add_argument("--smp", dest="smp",
370 ca1de37b Ilias Tsitsimpis
                        default=1,
371 ca1de37b Ilias Tsitsimpis
                        help="Virtual CPUs for every virtual node")
372 ca1de37b Ilias Tsitsimpis
    parser.add_argument("--vnc", dest="vnc",
373 ca1de37b Ilias Tsitsimpis
                        default=False, action="store_true",
374 ca1de37b Ilias Tsitsimpis
                        help="Wheter virtual nodes will have a vnc "
375 ca1de37b Ilias Tsitsimpis
                             "console or not")
376 ca1de37b Ilias Tsitsimpis
    parser.add_argument("--force", dest="force",
377 ca1de37b Ilias Tsitsimpis
                        default=False, action="store_true",
378 ca1de37b Ilias Tsitsimpis
                        help="Force the creation of new ssh key pairs")
379 ca1de37b Ilias Tsitsimpis
380 ca1de37b Ilias Tsitsimpis
    parser.add_argument("-i", "--ssh-key", dest="ssh_key",
381 ca1de37b Ilias Tsitsimpis
                        default=None,
382 ca1de37b Ilias Tsitsimpis
                        help="Path of an existing ssh key to use")
383 ca1de37b Ilias Tsitsimpis
384 ca1de37b Ilias Tsitsimpis
    parser.add_argument("--no-key-inject", dest="key_inject",
385 ca1de37b Ilias Tsitsimpis
                        default=True, action="store_false",
386 ca1de37b Ilias Tsitsimpis
                        help="Whether to inject ssh key pairs to hosts")
387 ca1de37b Ilias Tsitsimpis
388 ca1de37b Ilias Tsitsimpis
    # backend related options
389 ca1de37b Ilias Tsitsimpis
    parser.add_argument("--cluster-name", dest="cluster_name",
390 ca1de37b Ilias Tsitsimpis
                        default="ganeti1",
391 ca1de37b Ilias Tsitsimpis
                        help="The cluster name in ganeti.conf")
392 ca1de37b Ilias Tsitsimpis
393 ca1de37b Ilias Tsitsimpis
    # backend related options
394 ca1de37b Ilias Tsitsimpis
    parser.add_argument("--cluster-node", dest="cluster_node",
395 ca1de37b Ilias Tsitsimpis
                        default=None,
396 ca1de37b Ilias Tsitsimpis
                        help="The node to add to the existing cluster")
397 ca1de37b Ilias Tsitsimpis
398 ca1de37b Ilias Tsitsimpis
    # available commands
399 ca1de37b Ilias Tsitsimpis
    parser.add_argument("command", type=str,
400 ca1de37b Ilias Tsitsimpis
                        choices=["packages", "vcluster", "prepare",
401 ca1de37b Ilias Tsitsimpis
                                 "synnefo", "backend", "ganeti",
402 ca1de37b Ilias Tsitsimpis
                                 "run", "cleanup", "test",
403 ca1de37b Ilias Tsitsimpis
                                 "all", "add", "keygen"],
404 ca1de37b Ilias Tsitsimpis
                        help="Run on of the supported deployment commands")
405 ca1de37b Ilias Tsitsimpis
406 ca1de37b Ilias Tsitsimpis
    # available actions for the run command
407 ca1de37b Ilias Tsitsimpis
    parser.add_argument("actions", type=str, nargs="*",
408 ca1de37b Ilias Tsitsimpis
                        help="Run one or more of the supported subcommands")
409 ca1de37b Ilias Tsitsimpis
410 ca1de37b Ilias Tsitsimpis
    # disable colors in terminal
411 ca1de37b Ilias Tsitsimpis
    parser.add_argument("--disable-colors", dest="disable_colors",
412 ca1de37b Ilias Tsitsimpis
                        default=False, action="store_true",
413 ca1de37b Ilias Tsitsimpis
                        help="Disable colors in terminal")
414 ca1de37b Ilias Tsitsimpis
415 ca1de37b Ilias Tsitsimpis
    return parser.parse_args()
416 0ac84a9a Dimitris Aragiorgis
417 1bc6d467 Dionysis Grigoropoulos
418 0ac84a9a Dimitris Aragiorgis
def get_actions(*args):
419 0ac84a9a Dimitris Aragiorgis
    actions = {
420 ca1de37b Ilias Tsitsimpis
        # prepare actions
421 ca1de37b Ilias Tsitsimpis
        "ns":  ["setup_ns", "setup_resolv_conf"],
422 ca1de37b Ilias Tsitsimpis
        "hosts": ["setup_hosts", "add_keys"],
423 ca1de37b Ilias Tsitsimpis
        "check": ["check_dhcp", "check_dns",
424 ca1de37b Ilias Tsitsimpis
                  "check_connectivity", "check_ssh"],
425 ca1de37b Ilias Tsitsimpis
        "apt": ["apt_get_update", "setup_apt"],
426 ca1de37b Ilias Tsitsimpis
        "nfs": ["setup_nfs_server", "setup_nfs_clients"],
427 ca1de37b Ilias Tsitsimpis
        "prepare":  [
428 ca1de37b Ilias Tsitsimpis
            "setup_hosts", "add_keys",
429 ca1de37b Ilias Tsitsimpis
            "setup_ns", "setup_resolv_conf",
430 ca1de37b Ilias Tsitsimpis
            "check_dhcp", "check_dns", "check_connectivity", "check_ssh",
431 ca1de37b Ilias Tsitsimpis
            "apt_get_update", "setup_apt",
432 ca1de37b Ilias Tsitsimpis
            "setup_nfs_server", "setup_nfs_clients"
433 0ac84a9a Dimitris Aragiorgis
        ],
434 ca1de37b Ilias Tsitsimpis
        # synnefo actions
435 ca1de37b Ilias Tsitsimpis
        "synnefo": [
436 ca1de37b Ilias Tsitsimpis
            "setup_mq", "setup_db",
437 ca1de37b Ilias Tsitsimpis
            "setup_astakos",
438 ca1de37b Ilias Tsitsimpis
            #TODO: astakos-quota fails if no user is added.
439 ca1de37b Ilias Tsitsimpis
            #      add_user fails if no groups found
440 ca1de37b Ilias Tsitsimpis
            "astakos_loaddata", "add_user", "activate_user",
441 ca1de37b Ilias Tsitsimpis
            "astakos_register_components",
442 ca1de37b Ilias Tsitsimpis
            "setup_cms", "cms_loaddata",
443 ca1de37b Ilias Tsitsimpis
            "setup_pithos",
444 a1dae38d Christos Stavrakakis
            "setup_vncauthproxy",
445 ca1de37b Ilias Tsitsimpis
            "setup_cyclades", "cyclades_loaddata", "add_pools",
446 38fd3090 Christos Stavrakakis
            "export_services", "import_services", "set_user_quota",
447 ca1de37b Ilias Tsitsimpis
            "setup_kamaki", "upload_image", "register_image",
448 ca1de37b Ilias Tsitsimpis
            "setup_burnin"
449 0ac84a9a Dimitris Aragiorgis
        ],
450 ca1de37b Ilias Tsitsimpis
        "supdate": [
451 ca1de37b Ilias Tsitsimpis
            "apt_get_update", "setup_astakos",
452 ca1de37b Ilias Tsitsimpis
            "setup_cms", "setup_pithos", "setup_cyclades"
453 0ac84a9a Dimitris Aragiorgis
        ],
454 ca1de37b Ilias Tsitsimpis
        # backend actions
455 ca1de37b Ilias Tsitsimpis
        "backend": [
456 ca1de37b Ilias Tsitsimpis
            "setup_hosts",
457 ca1de37b Ilias Tsitsimpis
            "update_ns_for_ganeti",
458 ca1de37b Ilias Tsitsimpis
            "setup_ganeti", "init_cluster",
459 ca1de37b Ilias Tsitsimpis
            "add_rapi_user", "add_nodes",
460 ca1de37b Ilias Tsitsimpis
            "setup_image_host", "setup_image_helper",
461 ca1de37b Ilias Tsitsimpis
            "setup_network",
462 ca1de37b Ilias Tsitsimpis
            "setup_gtools", "add_backend", "add_network",
463 ca1de37b Ilias Tsitsimpis
            "setup_lvm", "enable_lvm",
464 ca1de37b Ilias Tsitsimpis
            "enable_drbd", "setup_drbd_dparams",
465 ca1de37b Ilias Tsitsimpis
            "setup_net_infra", "setup_iptables", "setup_router",
466 0ac84a9a Dimitris Aragiorgis
        ],
467 ca1de37b Ilias Tsitsimpis
        "bstorage": [
468 ca1de37b Ilias Tsitsimpis
            "setup_lvm", "enable_lvm",
469 ca1de37b Ilias Tsitsimpis
            "enable_drbd", "setup_drbd_dparams"
470 0ac84a9a Dimitris Aragiorgis
        ],
471 ca1de37b Ilias Tsitsimpis
        "bnetwork": ["setup_net_infra", "setup_iptables", "setup_router"],
472 ca1de37b Ilias Tsitsimpis
        "bupdate": [
473 ca1de37b Ilias Tsitsimpis
            "apt_get_update", "setup_ganeti", "setup_image_host",
474 ca1de37b Ilias Tsitsimpis
            "setup_image_helper", "setup_network", "setup_gtools"
475 0ac84a9a Dimitris Aragiorgis
        ],
476 ca1de37b Ilias Tsitsimpis
        # ganeti actions
477 ca1de37b Ilias Tsitsimpis
        "ganeti": [
478 ca1de37b Ilias Tsitsimpis
            "update_ns_for_ganeti",
479 ca1de37b Ilias Tsitsimpis
            "setup_ganeti", "init_cluster", "add_nodes",
480 ca1de37b Ilias Tsitsimpis
            "setup_image_host", "setup_image_helper", "add_image_locally",
481 ca1de37b Ilias Tsitsimpis
            "debootstrap", "setup_net_infra",
482 ca1de37b Ilias Tsitsimpis
            "setup_lvm", "enable_lvm", "enable_drbd", "setup_drbd_dparams",
483 0ac84a9a Dimitris Aragiorgis
        ],
484 ca1de37b Ilias Tsitsimpis
        "gupdate": ["setup_apt", "setup_ganeti"],
485 ca1de37b Ilias Tsitsimpis
        "gdestroy": ["destroy_cluster"],
486 ca1de37b Ilias Tsitsimpis
    }
487 0ac84a9a Dimitris Aragiorgis
488 0ac84a9a Dimitris Aragiorgis
    ret = []
489 0ac84a9a Dimitris Aragiorgis
    for x in args:
490 ca1de37b Ilias Tsitsimpis
        ret += actions[x]
491 0ac84a9a Dimitris Aragiorgis
492 0ac84a9a Dimitris Aragiorgis
    return ret
493 0ac84a9a Dimitris Aragiorgis
494 0ac84a9a Dimitris Aragiorgis
495 4b36944e Ilias Tsitsimpis
def must_create_keys(force, env):
496 4b36944e Ilias Tsitsimpis
    """Check if we need to create ssh keys
497 4b36944e Ilias Tsitsimpis

498 4b36944e Ilias Tsitsimpis
    If force is true we are going to overide the old keys.
499 4b36944e Ilias Tsitsimpis
    Else if there are already generated keys to use, don't create new ones.
500 4b36944e Ilias Tsitsimpis

501 4b36944e Ilias Tsitsimpis
    """
502 4b36944e Ilias Tsitsimpis
    if force:
503 4b36944e Ilias Tsitsimpis
        return True
504 4b36944e Ilias Tsitsimpis
    d = os.path.join(env.templates, "root/.ssh")
505 4b36944e Ilias Tsitsimpis
    auth_keys_exists = os.path.exists(os.path.join(d, "authorized_keys"))
506 4b36944e Ilias Tsitsimpis
    dsa_exists = os.path.exists(os.path.join(d, "id_dsa"))
507 4b36944e Ilias Tsitsimpis
    dsa_pub_exists = os.path.exists(os.path.join(d, "id_dsa.pub"))
508 4b36944e Ilias Tsitsimpis
    rsa_exists = os.path.exists(os.path.join(d, "id_rsa"))
509 4b36944e Ilias Tsitsimpis
    rsa_pub_exists = os.path.exists(os.path.join(d, "id_rsa.pub"))
510 4b36944e Ilias Tsitsimpis
    # If any of the above doesn't exist return True
511 4b36944e Ilias Tsitsimpis
    return not (dsa_exists and dsa_pub_exists
512 4b36944e Ilias Tsitsimpis
                and rsa_exists and rsa_pub_exists
513 4b36944e Ilias Tsitsimpis
                and auth_keys_exists)
514 4b36944e Ilias Tsitsimpis
515 4b36944e Ilias Tsitsimpis
516 4b36944e Ilias Tsitsimpis
def do_create_keys(args, env):
517 ca1de37b Ilias Tsitsimpis
    d = os.path.join(env.templates, "root/.ssh")
518 ca1de37b Ilias Tsitsimpis
    a = os.path.join(d, "authorized_keys")
519 ca1de37b Ilias Tsitsimpis
    # Delete old keys
520 ca1de37b Ilias Tsitsimpis
    for filename in os.listdir(d):
521 ca1de37b Ilias Tsitsimpis
        os.remove(os.path.join(d, filename))
522 ca1de37b Ilias Tsitsimpis
    # Generate new keys
523 ca1de37b Ilias Tsitsimpis
    for t in ("dsa", "rsa"):
524 ca1de37b Ilias Tsitsimpis
        f = os.path.join(d, "id_" + t)
525 ca1de37b Ilias Tsitsimpis
        cmd = 'ssh-keygen -q -t {0} -f {1} -N ""'.format(t, f)
526 ca1de37b Ilias Tsitsimpis
        os.system(cmd)
527 ca1de37b Ilias Tsitsimpis
        cmd = 'cat {0}.pub >> {1}'.format(f, a)
528 ca1de37b Ilias Tsitsimpis
        os.system(cmd)
529 ca1de37b Ilias Tsitsimpis
530 0ac84a9a Dimitris Aragiorgis
531 0ac84a9a Dimitris Aragiorgis
def add_node(args, env):
532 0ac84a9a Dimitris Aragiorgis
    actions = [
533 ca1de37b Ilias Tsitsimpis
        "update_ns_for_node:" + args.cluster_node,
534 ca1de37b Ilias Tsitsimpis
    ]
535 0ac84a9a Dimitris Aragiorgis
    fabcommand(args, env, actions)
536 0ac84a9a Dimitris Aragiorgis
    actions = [
537 ca1de37b Ilias Tsitsimpis
        "setup_resolv_conf",
538 ca1de37b Ilias Tsitsimpis
        "apt_get_update",
539 ca1de37b Ilias Tsitsimpis
        "setup_apt",
540 ca1de37b Ilias Tsitsimpis
        "setup_hosts",
541 ca1de37b Ilias Tsitsimpis
        "add_keys",
542 ca1de37b Ilias Tsitsimpis
    ]
543 0ac84a9a Dimitris Aragiorgis
    fabcommand(args, env, actions, [args.cluster_node])
544 0ac84a9a Dimitris Aragiorgis
545 0ac84a9a Dimitris Aragiorgis
    actions = get_actions("check")
546 0ac84a9a Dimitris Aragiorgis
    fabcommand(args, env, actions)
547 0ac84a9a Dimitris Aragiorgis
548 0ac84a9a Dimitris Aragiorgis
    actions = [
549 ca1de37b Ilias Tsitsimpis
        "setup_nfs_clients",
550 ca1de37b Ilias Tsitsimpis
        "setup_ganeti",
551 ca1de37b Ilias Tsitsimpis
        "setup_image_host", "setup_image_helper",
552 ca1de37b Ilias Tsitsimpis
        "setup_network", "setup_gtools",
553 ca1de37b Ilias Tsitsimpis
    ]
554 0ac84a9a Dimitris Aragiorgis
    fabcommand(args, env, actions, [args.cluster_node])
555 0ac84a9a Dimitris Aragiorgis
556 0ac84a9a Dimitris Aragiorgis
    actions = [
557 ca1de37b Ilias Tsitsimpis
        "add_node:" + args.cluster_node,
558 ca1de37b Ilias Tsitsimpis
    ]
559 0ac84a9a Dimitris Aragiorgis
    fabcommand(args, env, actions)
560 0ac84a9a Dimitris Aragiorgis
561 0ac84a9a Dimitris Aragiorgis
    actions = [
562 ca1de37b Ilias Tsitsimpis
        "setup_lvm", "enable_drbd",
563 ca1de37b Ilias Tsitsimpis
        "setup_net_infra", "setup_iptables",
564 ca1de37b Ilias Tsitsimpis
    ]
565 0ac84a9a Dimitris Aragiorgis
    fabcommand(args, env, actions, [args.cluster_node])
566 0ac84a9a Dimitris Aragiorgis
567 0ac84a9a Dimitris Aragiorgis
568 ca1de37b Ilias Tsitsimpis
def main():
569 ca1de37b Ilias Tsitsimpis
    args = parse_options()
570 ca1de37b Ilias Tsitsimpis
571 ca1de37b Ilias Tsitsimpis
    conf = Conf(args)
572 ca1de37b Ilias Tsitsimpis
    env = Env(conf)
573 ca1de37b Ilias Tsitsimpis
574 ca1de37b Ilias Tsitsimpis
    create_dir(env.run, False)
575 ca1de37b Ilias Tsitsimpis
    create_dir(env.dns, False)
576 ca1de37b Ilias Tsitsimpis
577 ca1de37b Ilias Tsitsimpis
    # Check if there are keys to use
578 ca1de37b Ilias Tsitsimpis
    if args.command == "keygen":
579 ca1de37b Ilias Tsitsimpis
        if must_create_keys(args.force, env):
580 ca1de37b Ilias Tsitsimpis
            do_create_keys(args, env)
581 ca1de37b Ilias Tsitsimpis
            return 0
582 ca1de37b Ilias Tsitsimpis
        else:
583 ca1de37b Ilias Tsitsimpis
            print "Keys already existed.. aborting"
584 ca1de37b Ilias Tsitsimpis
            return 1
585 0ac84a9a Dimitris Aragiorgis
    else:
586 ca1de37b Ilias Tsitsimpis
        if (args.key_inject and (args.ssh_key is None)
587 ca1de37b Ilias Tsitsimpis
                and must_create_keys(False, env)):
588 ca1de37b Ilias Tsitsimpis
            print "No ssh keys to use. Run `snf-deploy keygen' first."
589 ca1de37b Ilias Tsitsimpis
            return 1
590 ca1de37b Ilias Tsitsimpis
591 ca1de37b Ilias Tsitsimpis
    if args.command == "test":
592 ca1de37b Ilias Tsitsimpis
        conf.print_config()
593 ca1de37b Ilias Tsitsimpis
594 ca1de37b Ilias Tsitsimpis
    if args.command == "cleanup":
595 ca1de37b Ilias Tsitsimpis
        cleanup(args, env)
596 ca1de37b Ilias Tsitsimpis
597 ca1de37b Ilias Tsitsimpis
    if args.command == "packages":
598 ca1de37b Ilias Tsitsimpis
        create_dir(env.packages, True)
599 ca1de37b Ilias Tsitsimpis
        get_packages(args, env)
600 ca1de37b Ilias Tsitsimpis
601 ca1de37b Ilias Tsitsimpis
    if args.command == "vcluster":
602 ca1de37b Ilias Tsitsimpis
        image(args, env)
603 ca1de37b Ilias Tsitsimpis
        network(args, env)
604 ca1de37b Ilias Tsitsimpis
        create_dnsmasq_files(args, env)
605 ca1de37b Ilias Tsitsimpis
        dnsmasq(args, env)
606 ca1de37b Ilias Tsitsimpis
        cluster(args, env)
607 ca1de37b Ilias Tsitsimpis
608 ca1de37b Ilias Tsitsimpis
    if args.command == "prepare":
609 ca1de37b Ilias Tsitsimpis
        actions = get_actions("prepare")
610 ca1de37b Ilias Tsitsimpis
        fabcommand(args, env, actions)
611 ca1de37b Ilias Tsitsimpis
612 ca1de37b Ilias Tsitsimpis
    if args.command == "synnefo":
613 ca1de37b Ilias Tsitsimpis
        actions = get_actions("synnefo")
614 ca1de37b Ilias Tsitsimpis
        fabcommand(args, env, actions)
615 ca1de37b Ilias Tsitsimpis
616 ca1de37b Ilias Tsitsimpis
    if args.command == "backend":
617 ca1de37b Ilias Tsitsimpis
        actions = get_actions("backend")
618 ca1de37b Ilias Tsitsimpis
        fabcommand(args, env, actions)
619 ca1de37b Ilias Tsitsimpis
620 ca1de37b Ilias Tsitsimpis
    if args.command == "ganeti":
621 ca1de37b Ilias Tsitsimpis
        actions = get_actions("ganeti")
622 ca1de37b Ilias Tsitsimpis
        fabcommand(args, env, actions)
623 ca1de37b Ilias Tsitsimpis
624 ca1de37b Ilias Tsitsimpis
    if args.command == "all":
625 ca1de37b Ilias Tsitsimpis
        actions = get_actions("prepare", "synnefo", "backend")
626 ca1de37b Ilias Tsitsimpis
        fabcommand(args, env, actions)
627 ca1de37b Ilias Tsitsimpis
628 ca1de37b Ilias Tsitsimpis
    if args.command == "add":
629 ca1de37b Ilias Tsitsimpis
        if args.cluster_node:
630 ca1de37b Ilias Tsitsimpis
            add_node(args, env)
631 ca1de37b Ilias Tsitsimpis
        else:
632 ca1de37b Ilias Tsitsimpis
            actions = get_actions("backend")
633 ca1de37b Ilias Tsitsimpis
            fabcommand(args, env, actions)
634 ca1de37b Ilias Tsitsimpis
635 ca1de37b Ilias Tsitsimpis
    if args.command == "run":
636 ca1de37b Ilias Tsitsimpis
        if not args.actions:
637 ca1de37b Ilias Tsitsimpis
            print_available_actions(args.command)
638 ca1de37b Ilias Tsitsimpis
        else:
639 ca1de37b Ilias Tsitsimpis
            fabcommand(args, env, args.actions)
640 0ac84a9a Dimitris Aragiorgis
641 0ac84a9a Dimitris Aragiorgis
642 0ac84a9a Dimitris Aragiorgis
if __name__ == "__main__":
643 ca1de37b Ilias Tsitsimpis
    sys.exit(main())