Statistics
| Branch: | Tag: | Revision:

root / snf-deploy / snfdeploy / __init__.py @ c62a2729

History | View | Annotate | Download (20.2 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 0cfa5e03 Stratos Psomadakis
      setup_collectd
84 3c626269 Christos Stavrakakis
      setup_common           astakos_register_components   add_ns
85 0ac84a9a Dimitris Aragiorgis
      setup_cyclades         cms_loaddata                  add_user
86 0ac84a9a Dimitris Aragiorgis
      setup_db               cyclades_loaddata             connect_bridges
87 0ac84a9a Dimitris Aragiorgis
      setup_ganeti           enable_drbd                   create_bridges
88 0cfa5e03 Stratos Psomadakis
      setup_ganeti_collectd
89 0ac84a9a Dimitris Aragiorgis
      setup_gtools           init_cluster                  create_vlans
90 0ac84a9a Dimitris Aragiorgis
      setup_gunicorn         setup_nfs_clients             destroy_db
91 ca1de37b Ilias Tsitsimpis
      setup_hosts            setup_nfs_server              \
92 ca1de37b Ilias Tsitsimpis
get_auth_token_from_db
93 0ac84a9a Dimitris Aragiorgis
      setup_image_helper     update_ns_for_ganeti          get_service_details
94 952a28c0 Sofia Papagiannaki
      setup_image_host       astakos_register_pithos_view  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 0cfa5e03 Stratos Psomadakis
      setup_stats
106 0cfa5e03 Stratos Psomadakis
      setup_stats_collectd
107 0ac84a9a Dimitris Aragiorgis
      setup_vncauthproxy
108 0ac84a9a Dimitris Aragiorgis
      setup_webproject
109 0ac84a9a Dimitris Aragiorgis

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

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

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