Statistics
| Branch: | Tag: | Revision:

root / snf-deploy / snfdeploy / __init__.py @ 3bae85da

History | View | Annotate | Download (19 kB)

1 0ac84a9a Dimitris Aragiorgis
import json
2 0ac84a9a Dimitris Aragiorgis
import time
3 0ac84a9a Dimitris Aragiorgis
import ipaddr
4 0ac84a9a Dimitris Aragiorgis
import os
5 0ac84a9a Dimitris Aragiorgis
import signal
6 0ac84a9a Dimitris Aragiorgis
import time
7 0ac84a9a Dimitris Aragiorgis
import ConfigParser
8 0ac84a9a Dimitris Aragiorgis
import argparse
9 0ac84a9a Dimitris Aragiorgis
import sys
10 0ac84a9a Dimitris Aragiorgis
import re
11 0ac84a9a Dimitris Aragiorgis
import random
12 0ac84a9a Dimitris Aragiorgis
import subprocess
13 0ac84a9a Dimitris Aragiorgis
import imp
14 0ac84a9a Dimitris Aragiorgis
import ast
15 0ac84a9a Dimitris Aragiorgis
from snfdeploy.lib import *
16 3bae85da Dimitris Aragiorgis
from snfdeploy import fabfile
17 3bae85da Dimitris Aragiorgis
from fabric.api import hide, env, settings, local, roles, execute, show
18 0ac84a9a Dimitris Aragiorgis
19 0ac84a9a Dimitris Aragiorgis
def print_available_actions(command):
20 0ac84a9a Dimitris Aragiorgis
21 4b36944e Ilias Tsitsimpis
  if command == "keygen":
22 4b36944e Ilias Tsitsimpis
    print """
23 4b36944e Ilias Tsitsimpis
Usage: snf-deploy keygen [--force]
24 4b36944e Ilias Tsitsimpis

25 4b36944e Ilias Tsitsimpis
  Generate new ssh keys (both rsa and dsa keypairs)
26 4b36944e Ilias Tsitsimpis

27 4b36944e Ilias Tsitsimpis
  """
28 4b36944e Ilias Tsitsimpis
29 0ac84a9a Dimitris Aragiorgis
  if command == "vcluster":
30 0ac84a9a Dimitris Aragiorgis
    print """
31 0ac84a9a Dimitris Aragiorgis
Usage: snf-deploy vcluster
32 0ac84a9a Dimitris Aragiorgis

33 0ac84a9a Dimitris Aragiorgis
  Run the following actions concerning the local virtual cluster:
34 0ac84a9a Dimitris Aragiorgis

35 0ac84a9a Dimitris Aragiorgis
    - Download base image and create additional disk (if --create-extra-disk is passed)
36 0ac84a9a Dimitris Aragiorgis
    - Does all the network related actions (bridge, iptables, NAT)
37 0ac84a9a Dimitris Aragiorgis
    - Launches dnsmasq for dhcp server on bridge
38 0ac84a9a Dimitris Aragiorgis
    - Creates the virtual cluster (with kvm)
39 0ac84a9a Dimitris Aragiorgis

40 0ac84a9a Dimitris Aragiorgis
  """
41 0ac84a9a Dimitris Aragiorgis
42 0ac84a9a Dimitris Aragiorgis
  if command == "prepare":
43 0ac84a9a Dimitris Aragiorgis
    print """
44 0ac84a9a Dimitris Aragiorgis
Usage: snf-deploy prepare
45 0ac84a9a Dimitris Aragiorgis

46 0ac84a9a Dimitris Aragiorgis
  Run the following actions concerning deployment preparation:
47 0ac84a9a Dimitris Aragiorgis

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

54 0ac84a9a Dimitris Aragiorgis
  """
55 0ac84a9a Dimitris Aragiorgis
56 0ac84a9a Dimitris Aragiorgis
  if command == "backend":
57 0ac84a9a Dimitris Aragiorgis
    print """
58 0ac84a9a Dimitris Aragiorgis
Usage: snf-deploy backend [update]
59 0ac84a9a Dimitris Aragiorgis

60 0ac84a9a Dimitris Aragiorgis
  Run the following actions concerning a ganeti backend:
61 0ac84a9a Dimitris Aragiorgis

62 0ac84a9a Dimitris Aragiorgis
    - Create and add a backend to cyclades
63 0ac84a9a Dimitris Aragiorgis
    - Does all the net-infra specific actions in backend nodes
64 0ac84a9a Dimitris Aragiorgis
      (create/connect bridges, iptables..)
65 0ac84a9a Dimitris Aragiorgis
    - Does all the storage-infra specific actions in backend nodes
66 0ac84a9a Dimitris Aragiorgis
      depending on the --extra-disk option (create VG, enable lvm/drbd storage..)
67 0ac84a9a Dimitris Aragiorgis

68 0ac84a9a Dimitris Aragiorgis
    or
69 0ac84a9a Dimitris Aragiorgis

70 0ac84a9a Dimitris Aragiorgis
    - Update packages in an already registered backend in cyclades.
71 0ac84a9a Dimitris Aragiorgis

72 0ac84a9a Dimitris Aragiorgis
  """
73 0ac84a9a Dimitris Aragiorgis
74 0ac84a9a Dimitris Aragiorgis
  if command == "run":
75 0ac84a9a Dimitris Aragiorgis
    print """
76 0ac84a9a Dimitris Aragiorgis
Usage: snf-deploy run <action> [<action>...]
77 0ac84a9a Dimitris Aragiorgis

78 0ac84a9a Dimitris Aragiorgis
  Run any of the following fabric commands:
79 0ac84a9a Dimitris Aragiorgis

80 0ac84a9a Dimitris Aragiorgis

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

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

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

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