Statistics
| Branch: | Tag: | Revision:

root / snf-deploy / snfdeploy / __init__.py @ 83fd2ef0

History | View | Annotate | Download (17.4 kB)

1 3d32ff09 Dimitris Aragiorgis
import json
2 3d32ff09 Dimitris Aragiorgis
import time
3 3d32ff09 Dimitris Aragiorgis
import ipaddr
4 3d32ff09 Dimitris Aragiorgis
import os
5 3d32ff09 Dimitris Aragiorgis
import signal
6 3d32ff09 Dimitris Aragiorgis
import time
7 3d32ff09 Dimitris Aragiorgis
import ConfigParser
8 3d32ff09 Dimitris Aragiorgis
import argparse
9 3d32ff09 Dimitris Aragiorgis
import sys
10 3d32ff09 Dimitris Aragiorgis
import re
11 3d32ff09 Dimitris Aragiorgis
import random
12 3d32ff09 Dimitris Aragiorgis
import subprocess
13 3d32ff09 Dimitris Aragiorgis
import imp
14 3d32ff09 Dimitris Aragiorgis
import ast
15 3d32ff09 Dimitris Aragiorgis
from snfdeploy.lib import *
16 3d32ff09 Dimitris Aragiorgis
17 3d32ff09 Dimitris Aragiorgis
def print_available_actions(command):
18 3d32ff09 Dimitris Aragiorgis
19 3d32ff09 Dimitris Aragiorgis
  if command == "vcluster":
20 3d32ff09 Dimitris Aragiorgis
    print """
21 3d32ff09 Dimitris Aragiorgis
Usage: snf-deploy vcluster
22 3d32ff09 Dimitris Aragiorgis

23 3d32ff09 Dimitris Aragiorgis
  Run the following actions concerning the local virtual cluster:
24 3d32ff09 Dimitris Aragiorgis

25 3d32ff09 Dimitris Aragiorgis
    - Download base image and create additional disk (if --create-extra-disk is passed)
26 3d32ff09 Dimitris Aragiorgis
    - Does all the network related actions (bridge, iptables, NAT)
27 3d32ff09 Dimitris Aragiorgis
    - Launches dnsmasq for dhcp server on bridge
28 3d32ff09 Dimitris Aragiorgis
    - Creates the virtual cluster (with kvm)
29 3d32ff09 Dimitris Aragiorgis

30 3d32ff09 Dimitris Aragiorgis
  """
31 3d32ff09 Dimitris Aragiorgis
32 3d32ff09 Dimitris Aragiorgis
  if command == "prepare":
33 3d32ff09 Dimitris Aragiorgis
    print """
34 3d32ff09 Dimitris Aragiorgis
Usage: snf-deploy prepare
35 3d32ff09 Dimitris Aragiorgis

36 3d32ff09 Dimitris Aragiorgis
  Run the following actions concerning deployment preparation:
37 3d32ff09 Dimitris Aragiorgis

38 3d32ff09 Dimitris Aragiorgis
    - Setup an internal Domain Name Server
39 3d32ff09 Dimitris Aragiorgis
    - Tweak hosts and add ssh keys
40 3d32ff09 Dimitris Aragiorgis
    - Check network setup
41 3d32ff09 Dimitris Aragiorgis
    - Setup apt repository and apt-get update
42 3d32ff09 Dimitris Aragiorgis
    - Setup the nfs server and clients among all nodes
43 3d32ff09 Dimitris Aragiorgis

44 3d32ff09 Dimitris Aragiorgis
  """
45 3d32ff09 Dimitris Aragiorgis
46 3d32ff09 Dimitris Aragiorgis
  if command == "backend":
47 3d32ff09 Dimitris Aragiorgis
    print """
48 3d32ff09 Dimitris Aragiorgis
Usage: snf-deploy backend [update]
49 3d32ff09 Dimitris Aragiorgis

50 3d32ff09 Dimitris Aragiorgis
  Run the following actions concerning a ganeti backend:
51 3d32ff09 Dimitris Aragiorgis

52 3d32ff09 Dimitris Aragiorgis
    - Create and add a backend to cyclades
53 3d32ff09 Dimitris Aragiorgis
    - Does all the net-infra specific actions in backend nodes
54 3d32ff09 Dimitris Aragiorgis
      (create/connect bridges, iptables..)
55 3d32ff09 Dimitris Aragiorgis
    - Does all the storage-infra specific actions in backend nodes
56 3d32ff09 Dimitris Aragiorgis
      depending on the --extra-disk option (create VG, enable lvm/drbd storage..)
57 3d32ff09 Dimitris Aragiorgis

58 3d32ff09 Dimitris Aragiorgis
    or
59 3d32ff09 Dimitris Aragiorgis

60 3d32ff09 Dimitris Aragiorgis
    - Update packages in an already registered backend in cyclades.
61 3d32ff09 Dimitris Aragiorgis

62 3d32ff09 Dimitris Aragiorgis
  """
63 3d32ff09 Dimitris Aragiorgis
64 3d32ff09 Dimitris Aragiorgis
  if command == "run":
65 3d32ff09 Dimitris Aragiorgis
    print """
66 3d32ff09 Dimitris Aragiorgis
Usage: snf-deploy run <action> [<action>...]
67 3d32ff09 Dimitris Aragiorgis

68 3d32ff09 Dimitris Aragiorgis
  Run any of the following fabric commands:
69 3d32ff09 Dimitris Aragiorgis

70 3d32ff09 Dimitris Aragiorgis

71 3d32ff09 Dimitris Aragiorgis
    Setup commands:        Init commands:                Admin commands:
72 3d32ff09 Dimitris Aragiorgis
      setup_apache           add_pools                     activate_user
73 3d32ff09 Dimitris Aragiorgis
      setup_apt              add_rapi_user                 add_backend
74 3d32ff09 Dimitris Aragiorgis
      setup_astakos          add_nodes                     add_image_locally
75 3d32ff09 Dimitris Aragiorgis
      setup_cms              astakos_loaddata              add_network
76 3d32ff09 Dimitris Aragiorgis
      setup_common           astakos_register_services     add_ns
77 3d32ff09 Dimitris Aragiorgis
      setup_cyclades         cms_loaddata                  add_user
78 3d32ff09 Dimitris Aragiorgis
      setup_db               cyclades_loaddata             connect_bridges
79 3d32ff09 Dimitris Aragiorgis
      setup_ganeti           enable_drbd                   create_bridges
80 3d32ff09 Dimitris Aragiorgis
      setup_gtools           init_cluster                  create_vlans
81 3d32ff09 Dimitris Aragiorgis
      setup_gunicorn         setup_nfs_clients             destroy_db
82 3d32ff09 Dimitris Aragiorgis
      setup_hosts            setup_nfs_server              get_auth_token_from_db
83 3d32ff09 Dimitris Aragiorgis
      setup_image_helper     update_ns_for_ganeti          get_service_details
84 3d32ff09 Dimitris Aragiorgis
      setup_image_host                                     gnt_instance_add
85 3d32ff09 Dimitris Aragiorgis
      setup_iptables                                       gnt_network_add
86 3d32ff09 Dimitris Aragiorgis
      setup_kamaki         Test commands:                  register_image
87 3d32ff09 Dimitris Aragiorgis
      setup_lvm              test                          restart_services
88 3d32ff09 Dimitris Aragiorgis
      setup_mq                                             setup_drbd_dparams
89 3d32ff09 Dimitris Aragiorgis
      setup_net_infra
90 3d32ff09 Dimitris Aragiorgis
      setup_network
91 3d32ff09 Dimitris Aragiorgis
      setup_ns
92 3d32ff09 Dimitris Aragiorgis
      setup_pithos
93 3d32ff09 Dimitris Aragiorgis
      setup_pithos_dir
94 3d32ff09 Dimitris Aragiorgis
      setup_router
95 3d32ff09 Dimitris Aragiorgis
      setup_vncauthproxy
96 3d32ff09 Dimitris Aragiorgis
      setup_webproject
97 3d32ff09 Dimitris Aragiorgis

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