syndicate plugin WIP, added in requests to syndicate in background
[nodemanager.git] / plugins / syndicate.py
1 #!/usr/bin/python
2
3 """ Syndicate configurator.  """
4
5 import httplib
6 import os
7 import shutil
8
9 from threading import Thread
10 import logger
11 import tools
12
13 def start():
14     logger.log('syndicate plugin starting up...')
15
16 def syndicate_op(op, mountpoint, syndicate_ip):
17     #op="GET"
18     #syndicate_ip="www.vicci.org"
19
20     logger.log("Syndicate: Http op %s on url %s to host %s" % (op, mountpoint, syndicate_ip))
21
22     try:
23         conn = httplib.HTTPSConnection(syndicate_ip, timeout=60)
24         conn.request(op, mountpoint)
25         r1 = conn.getresponse()
26     except:
27         logger.log_exc("Exception when contacting syndicate sliver", "Syndicate")
28
29     if (r1.status / 100) != 2:
30        logger.log("Syndicate: Error: Got http result %d on %s" % (r1.status, mountpoint))
31        return False
32
33     return result
34
35
36 def enable_syndicate_mount(sliver, mountpoint, syndicate_ip):
37     if not os.path.exists(mountpoint):
38        try:
39            os.mkdir(mountpoint)
40        except:
41            logger.log_exc("failed to mkdir syndicate mountpoint", "Syndicate")
42            return
43
44     syndicate_op("PUT", mountpoint, syndicate_ip)
45
46 def disable_syndicate_mount(sliver, mountpoint, syndicate_ip):
47     syndicate_op("DELETE", mountpoint, syndicate_ip)
48
49     if os.path.exists(mountpoint):
50        try:
51            os.rmdir(mountpoint)
52        except:
53            logger.log_exc("failed to delete syndicate mountpoint", "Syndicate")
54
55 def get_syndicate_ip():
56     fn = "/vservers/princeton_syndicate/var/lib/dhclient/dhclient-eth0.leases"
57     if not os.path.exists(fn):
58         logger.log("Syndicate: cannot find princeton_syndicate's dhclient lease db")
59         return None
60
61     fixed_address = None
62     for line in open(fn).readlines():
63         line = line.strip()
64         if line.startswith("fixed-address"):
65             fixed_address = line
66
67     if not fixed_address:
68         logger.log("Syndicate: no fixed_address line in dhclient lease db")
69         return None
70
71     parts=fixed_address.split(" ")
72     if len(parts)!=2:
73         logger.log("Syndicate: malformed fixed-address line in dhclient: %s" % line)
74         return None
75
76     ip = parts[1].strip(";")
77
78     #logger.log("Syndicate ip is %s" % ip)
79
80     return ip
81
82 def GetSlivers(data, conf = None, plc = None):
83     node_id = tools.node_id()
84
85     if 'slivers' not in data:
86         logger.log_missing_data("syndicate.GetSlivers",'slivers')
87         return
88
89     for sliver in data['slivers']:
90         enable_syndicate = False
91
92         # build a dict of attributes, because it's more convenient
93         attributes={}
94         for attribute in sliver['attributes']:
95            attributes[attribute['tagname']] = attribute['value']
96
97         sliver_name = sliver['name']
98         syndicate_mountpoint = os.path.join("/vservers", sliver_name, "syndicate")
99         enable_syndicate = attributes.get("enable_syndicate", False)
100         has_syndicate = os.path.exists(syndicate_mountpoint)
101
102         if enable_syndicate and (not has_syndicate):
103             logger.log("Syndicate: enabling syndicate for %s" % sliver_name)
104             #enable_syndicate_mount(sliver, syndicate_mountpoint, get_syndicate_ip())
105             t = Thread(target=enable_syndicate_mount, args=(sliver, syndicate_mountpoint, get_syndicate_ip()))
106             t.start()
107
108         elif (not enable_syndicate) and (has_syndicate):
109             logger.log("Syndicate: disabling syndicate for %s" % sliver_name)
110             #disable_syndicate_mount(sliver, syndicate_mountpoint, get_syndicate_ip())
111             t = Thread(target=disable_syndicate_mount, args=(sliver, syndicate_mountpoint, get_syndicate_ip()))
112             t.start()
113