Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (18.8 kB)

1 3c3bccab Dimitris Aragiorgis
# Copyright (C) 2010, 2011, 2012, 2013 GRNET S.A. All rights reserved.
2 3c3bccab Dimitris Aragiorgis
#
3 3c3bccab Dimitris Aragiorgis
# Redistribution and use in source and binary forms, with or
4 3c3bccab Dimitris Aragiorgis
# without modification, are permitted provided that the following
5 3c3bccab Dimitris Aragiorgis
# conditions are met:
6 3c3bccab Dimitris Aragiorgis
#
7 3c3bccab Dimitris Aragiorgis
#   1. Redistributions of source code must retain the above
8 3c3bccab Dimitris Aragiorgis
#      copyright notice, this list of conditions and the following
9 3c3bccab Dimitris Aragiorgis
#      disclaimer.
10 3c3bccab Dimitris Aragiorgis
#
11 3c3bccab Dimitris Aragiorgis
#   2. Redistributions in binary form must reproduce the above
12 3c3bccab Dimitris Aragiorgis
#      copyright notice, this list of conditions and the following
13 3c3bccab Dimitris Aragiorgis
#      disclaimer in the documentation and/or other materials
14 3c3bccab Dimitris Aragiorgis
#      provided with the distribution.
15 3c3bccab Dimitris Aragiorgis
#
16 3c3bccab Dimitris Aragiorgis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 3c3bccab Dimitris Aragiorgis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 3c3bccab Dimitris Aragiorgis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 3c3bccab Dimitris Aragiorgis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A. OR
20 3c3bccab Dimitris Aragiorgis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 3c3bccab Dimitris Aragiorgis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 3c3bccab Dimitris Aragiorgis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 3c3bccab Dimitris Aragiorgis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 3c3bccab Dimitris Aragiorgis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 3c3bccab Dimitris Aragiorgis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 3c3bccab Dimitris Aragiorgis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 3c3bccab Dimitris Aragiorgis
# POSSIBILITY OF SUCH DAMAGE.
28 3c3bccab Dimitris Aragiorgis
#
29 3c3bccab Dimitris Aragiorgis
# The views and conclusions contained in the software and
30 3c3bccab Dimitris Aragiorgis
# documentation are those of the authors and should not be
31 3c3bccab Dimitris Aragiorgis
# interpreted as representing official policies, either expressed
32 3c3bccab Dimitris Aragiorgis
# or implied, of GRNET S.A.
33 3c3bccab Dimitris Aragiorgis
34 0ac84a9a Dimitris Aragiorgis
import time
35 0ac84a9a Dimitris Aragiorgis
import os
36 0ac84a9a Dimitris Aragiorgis
import argparse
37 0ac84a9a Dimitris Aragiorgis
import sys
38 0ac84a9a Dimitris Aragiorgis
import re
39 0ac84a9a Dimitris Aragiorgis
import random
40 0ac84a9a Dimitris Aragiorgis
import ast
41 3c3bccab Dimitris Aragiorgis
import glob
42 ca1de37b Ilias Tsitsimpis
from snfdeploy.lib import check_pidfile, create_dir, get_default_route, \
43 3c3bccab Dimitris Aragiorgis
    random_mac, Conf, Env, Status
44 3c3bccab Dimitris Aragiorgis
# from snfdeploy import fabfile
45 3c3bccab Dimitris Aragiorgis
from snfdeploy import fabfile2 as fabfile
46 ca1de37b Ilias Tsitsimpis
from fabric.api import hide, settings, execute, show
47 ca1de37b Ilias Tsitsimpis
48 0ac84a9a Dimitris Aragiorgis
49 0ac84a9a Dimitris Aragiorgis
def print_available_actions(command):
50 0ac84a9a Dimitris Aragiorgis
51 ca1de37b Ilias Tsitsimpis
    if command == "keygen":
52 ca1de37b Ilias Tsitsimpis
        print """
53 4b36944e Ilias Tsitsimpis
Usage: snf-deploy keygen [--force]
54 4b36944e Ilias Tsitsimpis

55 4b36944e Ilias Tsitsimpis
  Generate new ssh keys (both rsa and dsa keypairs)
56 4b36944e Ilias Tsitsimpis

57 4b36944e Ilias Tsitsimpis
  """
58 4b36944e Ilias Tsitsimpis
59 ca1de37b Ilias Tsitsimpis
    if command == "vcluster":
60 ca1de37b Ilias Tsitsimpis
        print """
61 0ac84a9a Dimitris Aragiorgis
Usage: snf-deploy vcluster
62 0ac84a9a Dimitris Aragiorgis

63 0ac84a9a Dimitris Aragiorgis
  Run the following actions concerning the local virtual cluster:
64 0ac84a9a Dimitris Aragiorgis

65 ca1de37b Ilias Tsitsimpis
    - Download base image and create additional disk \
66 ca1de37b Ilias Tsitsimpis
(if --create-extra-disk is passed)
67 0ac84a9a Dimitris Aragiorgis
    - Does all the network related actions (bridge, iptables, NAT)
68 0ac84a9a Dimitris Aragiorgis
    - Launches dnsmasq for dhcp server on bridge
69 0ac84a9a Dimitris Aragiorgis
    - Creates the virtual cluster (with kvm)
70 0ac84a9a Dimitris Aragiorgis

71 0ac84a9a Dimitris Aragiorgis
  """
72 0ac84a9a Dimitris Aragiorgis
73 ca1de37b Ilias Tsitsimpis
    if command == "backend":
74 ca1de37b Ilias Tsitsimpis
        print """
75 3c3bccab Dimitris Aragiorgis
Usage: snf-deploy backend
76 0ac84a9a Dimitris Aragiorgis

77 0ac84a9a Dimitris Aragiorgis
  Run the following actions concerning a ganeti backend:
78 0ac84a9a Dimitris Aragiorgis

79 0ac84a9a Dimitris Aragiorgis
    - Create and add a backend to cyclades
80 0ac84a9a Dimitris Aragiorgis

81 0ac84a9a Dimitris Aragiorgis
  """
82 0ac84a9a Dimitris Aragiorgis
83 ca1de37b Ilias Tsitsimpis
    if command == "run":
84 ca1de37b Ilias Tsitsimpis
        print """
85 0ac84a9a Dimitris Aragiorgis
Usage: snf-deploy run <action> [<action>...]
86 0ac84a9a Dimitris Aragiorgis

87 0ac84a9a Dimitris Aragiorgis
  Run any of the following fabric commands:
88 0ac84a9a Dimitris Aragiorgis

89 3c3bccab Dimitris Aragiorgis
    Role setup:
90 3c3bccab Dimitris Aragiorgis

91 3c3bccab Dimitris Aragiorgis
      setup_ns_role
92 3c3bccab Dimitris Aragiorgis
      setup_nfs_role
93 3c3bccab Dimitris Aragiorgis
      setup_db_role
94 3c3bccab Dimitris Aragiorgis
      setup_mq_role
95 3c3bccab Dimitris Aragiorgis
      setup_astakos_role
96 3c3bccab Dimitris Aragiorgis
      setup_pithos_role
97 3c3bccab Dimitris Aragiorgis
      setup_cyclades_role
98 3c3bccab Dimitris Aragiorgis
      setup_cms_role
99 3c3bccab Dimitris Aragiorgis
      setup_ganeti_role
100 3c3bccab Dimitris Aragiorgis
      setup_master_role
101 3c3bccab Dimitris Aragiorgis
      setup_stats_role
102 3c3bccab Dimitris Aragiorgis
      setup_client_role
103 3c3bccab Dimitris Aragiorgis

104 3c3bccab Dimitris Aragiorgis
    Helper commands:
105 3c3bccab Dimitris Aragiorgis

106 3c3bccab Dimitris Aragiorgis
      update_env_with_user_info
107 3c3bccab Dimitris Aragiorgis
      update_env_with_service_info
108 3c3bccab Dimitris Aragiorgis
      update_env_with_backend_info
109 0ac84a9a Dimitris Aragiorgis

110 3c3bccab Dimitris Aragiorgis
    Admin commands:
111 3c3bccab Dimitris Aragiorgis

112 3c3bccab Dimitris Aragiorgis
      update_ns_for_node
113 3c3bccab Dimitris Aragiorgis
      update_exports_for_node
114 3c3bccab Dimitris Aragiorgis
      allow_db_access
115 3c3bccab Dimitris Aragiorgis
      add_ganeti_backend
116 3c3bccab Dimitris Aragiorgis
      add_synnefo_user
117 3c3bccab Dimitris Aragiorgis
      activate_user
118 3c3bccab Dimitris Aragiorgis
      set_default_quota
119 3c3bccab Dimitris Aragiorgis
      add_public_networks
120 3c3bccab Dimitris Aragiorgis
      add_image
121 3c3bccab Dimitris Aragiorgis

122 3c3bccab Dimitris Aragiorgis

123 3c3bccab Dimitris Aragiorgis
    Custom command:
124 3c3bccab Dimitris Aragiorgis

125 3c3bccab Dimitris Aragiorgis
      setup --node NODE [--role ROLE | --method METHOD --component COMPONENT]
126 0ac84a9a Dimitris Aragiorgis

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

501 4b36944e Ilias Tsitsimpis
    """
502 4b36944e Ilias Tsitsimpis
    d = os.path.join(env.templates, "root/.ssh")
503 4b36944e Ilias Tsitsimpis
    auth_keys_exists = os.path.exists(os.path.join(d, "authorized_keys"))
504 4b36944e Ilias Tsitsimpis
    dsa_exists = os.path.exists(os.path.join(d, "id_dsa"))
505 4b36944e Ilias Tsitsimpis
    dsa_pub_exists = os.path.exists(os.path.join(d, "id_dsa.pub"))
506 4b36944e Ilias Tsitsimpis
    rsa_exists = os.path.exists(os.path.join(d, "id_rsa"))
507 4b36944e Ilias Tsitsimpis
    rsa_pub_exists = os.path.exists(os.path.join(d, "id_rsa.pub"))
508 4b36944e Ilias Tsitsimpis
    # If any of the above doesn't exist return True
509 4b36944e Ilias Tsitsimpis
    return not (dsa_exists and dsa_pub_exists
510 4b36944e Ilias Tsitsimpis
                and rsa_exists and rsa_pub_exists
511 4b36944e Ilias Tsitsimpis
                and auth_keys_exists)
512 4b36944e Ilias Tsitsimpis
513 4b36944e Ilias Tsitsimpis
514 4b36944e Ilias Tsitsimpis
def do_create_keys(args, env):
515 ca1de37b Ilias Tsitsimpis
    d = os.path.join(env.templates, "root/.ssh")
516 ca1de37b Ilias Tsitsimpis
    a = os.path.join(d, "authorized_keys")
517 ca1de37b Ilias Tsitsimpis
    # Delete old keys
518 ca1de37b Ilias Tsitsimpis
    for filename in os.listdir(d):
519 ca1de37b Ilias Tsitsimpis
        os.remove(os.path.join(d, filename))
520 ca1de37b Ilias Tsitsimpis
    # Generate new keys
521 ca1de37b Ilias Tsitsimpis
    for t in ("dsa", "rsa"):
522 ca1de37b Ilias Tsitsimpis
        f = os.path.join(d, "id_" + t)
523 ca1de37b Ilias Tsitsimpis
        cmd = 'ssh-keygen -q -t {0} -f {1} -N ""'.format(t, f)
524 ca1de37b Ilias Tsitsimpis
        os.system(cmd)
525 ca1de37b Ilias Tsitsimpis
        cmd = 'cat {0}.pub >> {1}'.format(f, a)
526 ca1de37b Ilias Tsitsimpis
        os.system(cmd)
527 ca1de37b Ilias Tsitsimpis
528 0ac84a9a Dimitris Aragiorgis
529 3c3bccab Dimitris Aragiorgis
def must_create_ddns_keys(env):
530 3c3bccab Dimitris Aragiorgis
    d = os.path.join(env.templates, "root/ddns")
531 3c3bccab Dimitris Aragiorgis
    key_exists = glob.glob(os.path.join(d, "Kddns*key"))
532 3c3bccab Dimitris Aragiorgis
    private_exists = glob.glob(os.path.join(d, "Kddns*private"))
533 3c3bccab Dimitris Aragiorgis
    bind_key_exists = os.path.exists(os.path.join(d, "ddns.key"))
534 3c3bccab Dimitris Aragiorgis
    return not (key_exists and private_exists and bind_key_exists)
535 3c3bccab Dimitris Aragiorgis
536 3c3bccab Dimitris Aragiorgis
537 3c3bccab Dimitris Aragiorgis
def find_ddns_key_files(env):
538 3c3bccab Dimitris Aragiorgis
    d = os.path.join(env.templates, "root/ddns")
539 3c3bccab Dimitris Aragiorgis
    keys = glob.glob(os.path.join(d, "Kddns*"))
540 3c3bccab Dimitris Aragiorgis
    # Here we must have a key!
541 3c3bccab Dimitris Aragiorgis
    return map(os.path.basename, keys)
542 3c3bccab Dimitris Aragiorgis
543 3c3bccab Dimitris Aragiorgis
544 3c3bccab Dimitris Aragiorgis
def do_create_ddns_keys(args, env):
545 3c3bccab Dimitris Aragiorgis
    d = os.path.join(env.templates, "root/ddns")
546 3c3bccab Dimitris Aragiorgis
    if not os.path.exists(d):
547 3c3bccab Dimitris Aragiorgis
        os.mkdir(d)
548 3c3bccab Dimitris Aragiorgis
    for filename in os.listdir(d):
549 3c3bccab Dimitris Aragiorgis
        os.remove(os.path.join(d, filename))
550 3c3bccab Dimitris Aragiorgis
    cmd = """
551 3c3bccab Dimitris Aragiorgis
dnssec-keygen -a HMAC-MD5 -b 128 -K {0} -r /dev/urandom -n USER DDNS_UPDATE
552 3c3bccab Dimitris Aragiorgis
key=$(cat {0}/Kddns_update*.key | awk '{{ print $7 }}')
553 3c3bccab Dimitris Aragiorgis
cat > {0}/ddns.key <<EOF
554 3c3bccab Dimitris Aragiorgis
key DDNS_UPDATE {{
555 3c3bccab Dimitris Aragiorgis
        algorithm HMAC-MD5.SIG-ALG.REG.INT;
556 3c3bccab Dimitris Aragiorgis
        secret "$key";
557 3c3bccab Dimitris Aragiorgis
}};
558 3c3bccab Dimitris Aragiorgis
EOF
559 3c3bccab Dimitris Aragiorgis
""".format(d)
560 3c3bccab Dimitris Aragiorgis
    os.system(cmd)
561 3c3bccab Dimitris Aragiorgis
562 0ac84a9a Dimitris Aragiorgis
563 ca1de37b Ilias Tsitsimpis
def main():
564 ca1de37b Ilias Tsitsimpis
    args = parse_options()
565 ca1de37b Ilias Tsitsimpis
566 ca1de37b Ilias Tsitsimpis
    conf = Conf(args)
567 ca1de37b Ilias Tsitsimpis
    env = Env(conf)
568 3c3bccab Dimitris Aragiorgis
    env.status = Status(args)
569 ca1de37b Ilias Tsitsimpis
570 ca1de37b Ilias Tsitsimpis
    create_dir(env.run, False)
571 ca1de37b Ilias Tsitsimpis
    create_dir(env.dns, False)
572 ca1de37b Ilias Tsitsimpis
573 ca1de37b Ilias Tsitsimpis
    # Check if there are keys to use
574 ca1de37b Ilias Tsitsimpis
    if args.command == "keygen":
575 3c3bccab Dimitris Aragiorgis
        if not args.force:
576 3c3bccab Dimitris Aragiorgis
            if not must_create_keys(env) or not must_create_ddns_keys(env):
577 3c3bccab Dimitris Aragiorgis
                print "Keys already exist.."
578 3c3bccab Dimitris Aragiorgis
                print "To override existing ones use --force."
579 3c3bccab Dimitris Aragiorgis
                return 1
580 3c3bccab Dimitris Aragiorgis
        do_create_keys(args, env)
581 3c3bccab Dimitris Aragiorgis
        do_create_ddns_keys(args, env)
582 3c3bccab Dimitris Aragiorgis
        return 0
583 0ac84a9a Dimitris Aragiorgis
    else:
584 3c3bccab Dimitris Aragiorgis
        if ((args.key_inject and not args.ssh_key and must_create_keys(env)) or
585 3c3bccab Dimitris Aragiorgis
            must_create_ddns_keys(env)):
586 3c3bccab Dimitris Aragiorgis
            print "No ssh/ddns keys to use. Run `snf-deploy keygen' first."
587 ca1de37b Ilias Tsitsimpis
            return 1
588 3c3bccab Dimitris Aragiorgis
        env.ddns_keys = find_ddns_key_files(env)
589 3c3bccab Dimitris Aragiorgis
        env.ddns_private_key = "/root/ddns/" + env.ddns_keys[0]
590 ca1de37b Ilias Tsitsimpis
591 ca1de37b Ilias Tsitsimpis
    if args.command == "test":
592 ca1de37b Ilias Tsitsimpis
        conf.print_config()
593 ca1de37b Ilias Tsitsimpis
594 ca1de37b Ilias Tsitsimpis
    if args.command == "cleanup":
595 ca1de37b Ilias Tsitsimpis
        cleanup(args, env)
596 ca1de37b Ilias Tsitsimpis
597 ca1de37b Ilias Tsitsimpis
    if args.command == "packages":
598 ca1de37b Ilias Tsitsimpis
        create_dir(env.packages, True)
599 ca1de37b Ilias Tsitsimpis
        get_packages(args, env)
600 ca1de37b Ilias Tsitsimpis
601 ca1de37b Ilias Tsitsimpis
    if args.command == "vcluster":
602 ca1de37b Ilias Tsitsimpis
        image(args, env)
603 ca1de37b Ilias Tsitsimpis
        network(args, env)
604 ca1de37b Ilias Tsitsimpis
        create_dnsmasq_files(args, env)
605 ca1de37b Ilias Tsitsimpis
        dnsmasq(args, env)
606 ca1de37b Ilias Tsitsimpis
        cluster(args, env)
607 ca1de37b Ilias Tsitsimpis
608 ca1de37b Ilias Tsitsimpis
    if args.command == "backend":
609 ca1de37b Ilias Tsitsimpis
        actions = get_actions("backend")
610 ca1de37b Ilias Tsitsimpis
        fabcommand(args, env, actions)
611 ca1de37b Ilias Tsitsimpis
612 ca1de37b Ilias Tsitsimpis
    if args.command == "ganeti":
613 ca1de37b Ilias Tsitsimpis
        actions = get_actions("ganeti")
614 ca1de37b Ilias Tsitsimpis
        fabcommand(args, env, actions)
615 ca1de37b Ilias Tsitsimpis
616 ca1de37b Ilias Tsitsimpis
    if args.command == "all":
617 3c3bccab Dimitris Aragiorgis
        actions = get_actions("all")
618 ca1de37b Ilias Tsitsimpis
        fabcommand(args, env, actions)
619 ca1de37b Ilias Tsitsimpis
620 ca1de37b Ilias Tsitsimpis
    if args.command == "run":
621 ca1de37b Ilias Tsitsimpis
        if not args.actions:
622 ca1de37b Ilias Tsitsimpis
            print_available_actions(args.command)
623 ca1de37b Ilias Tsitsimpis
        else:
624 ca1de37b Ilias Tsitsimpis
            fabcommand(args, env, args.actions)
625 0ac84a9a Dimitris Aragiorgis
626 0ac84a9a Dimitris Aragiorgis
627 0ac84a9a Dimitris Aragiorgis
if __name__ == "__main__":
628 ca1de37b Ilias Tsitsimpis
    sys.exit(main())