reviewed Guilherme's code
[nodemanager.git] / plugins / update_ipv6addr_slivertag.py
1 # -*- python-indent: 4 -*-
2
3 """
4 Description: Update the IPv6 Address sliver tag accordingly to the IPv6 address set
5 update_ipv6addr_slivertag nodemanager plugin
6 Version: 0.5
7 Author: Guilherme Sperb Machado <gsm@machados.org>
8 """
9
10 import logger
11 import os
12 import socket
13 import re
14
15 import tools
16 import libvirt
17 import uuid
18 from sliver_libvirt import Sliver_Libvirt
19 from xml.dom.minidom import parseString
20
21 priority=150
22
23 ipv6addrtag = 'ipv6_address'
24
25 def start():
26     logger.log("update_ipv6addr_slivertag: plugin starting up...")
27
28
29 def getSliverTagId(slivertags):
30     for slivertag in slivertags:
31         if slivertag['tagname']==ipv6addrtag:
32             return slivertag['slice_tag_id']
33     return None
34
35 def SetSliverTag(plc, data, tagname):
36
37     for slice in data['slivers']:
38         logger.log("update_ipv6addr_slivertag: starting with slice=%s" % (slice['name']) )
39
40         # TODO: what about the prefixlen? should we add on it as well?
41         # here, I'm just taking the ipv6addr (value)
42         value,prefixlen = tools.get_sliver_ipv6(slice['name'])
43
44     node_id = tools.node_id()
45     slivertags = plc.GetSliceTags({"name":slice['name'],"node_id":node_id,"tagname":tagname})
46         #logger.log(repr(str(slivertags)))
47         #for tag in slivertags:
48         #       logger.log(repr(str(tag)))
49
50     ipv6addr = plc.GetSliceIPv6Address(slice['name'])
51     logger.log("update_ipv6addr_slivertag: slice=%s getSliceIPv6Address=%s" % \
52                (slice['name'],ipv6addr) )
53     # if the value to set is null...
54     if value is None:
55         if ipv6addr is not None:
56             # then, let's remove the slice tag
57             slivertag_id = getSliverTagId(slivertags)
58             if slivertag_id:
59                 try:
60                     plc.DeleteSliceTag(slivertag_id)
61                     logger.log("update_ipv6addr_slivertag: slice tag deleted for slice=%s" % \
62                                (slice['name']) )
63                 except:
64                     logger.log("update_ipv6addr_slivertag: slice tag not deleted for slice=%s" % \
65                                (slice['name']) )
66         # if there's no ipv6 address anymore, then remove everything from the /etc/hosts
67         tools.remove_all_ipv6addr_hosts(slice['name'], data['hostname'])
68     else:
69         # if the ipv6 addr set on the slice does not exist yet, so, let's add it
70         if (ipv6addr is None) and len(value)>0:
71             try:
72                 logger.log("update_ipv6addr_slivertag: slice name=%s" % (slice['name']) )
73                 slivertag_id=plc.AddSliceTag(slice['name'],tagname,value,node_id)
74                 logger.log("update_ipv6addr_slivertag: slice tag added to slice %s" % \
75                            (slice['name']) )
76             except:
77                 logger.log("update_ipv6addr_slivertag: could not set ipv6 addr tag to sliver. "+
78                            "slice=%s tag=%s node_id=%d" % (slice['name'],tagname,node_id) )
79         # if the ipv6 addr set on the slice is different on the value provided, let's update it
80         if (ipv6addr is not None) and (len(value)>0) and (ipv6addr!=value):
81             slivertag_id = getSliverTagId(slivertags)
82             plc.UpdateSliceTag(slivertag_id,value)
83         # ipv6 entry on /etc/hosts of each slice
84         result = tools.search_ipv6addr_hosts(slice['name'], value)
85         if not result:
86             tools.remove_all_ipv6addr_hosts(slice['name'], data['hostname'])
87             tools.add_ipv6addr_hosts_line(slice['name'], data['hostname'], value)
88     logger.log("update_ipv6addr_slivertag: finishing the update process for " +
89                "slice=%s" % (slice['name']) )
90
91 def GetSlivers(data, config, plc):
92
93     SetSliverTag(plc, data, ipv6addrtag)
94
95     logger.log("update_ipv6addr_slivertag: all done!")