6ceb87fc299a842f5ee0c336bd11421c360afe37
[sfa.git] / sfa / rspecs / elements / versions / nitosv1Sliver.py
1 from sfa.util.xrn import Xrn
2 from sfa.util.xml import XmlElement
3
4 from sfa.rspecs.elements.element import Element
5 from sfa.rspecs.elements.sliver import Sliver
6 from sfa.rspecs.elements.versions.nitosv1PLTag import NITOSv1PLTag
7
8 #from sfa.planetlab.plxrn import PlXrn
9
10
11 class NITOSv1Sliver:
12
13     @staticmethod
14     def add_slivers(xml, slivers):
15         if not slivers:
16             return
17         if not isinstance(slivers, list):
18             slivers = [slivers]
19         for sliver in slivers:
20             sliver_elem = xml.add_instance('sliver', sliver, ['name'])
21             tags = sliver.get('tags', [])
22             if tags:
23                 for tag in tags:
24                     NITOSv1Sliver.add_sliver_attribute(
25                         sliver_elem, tag['tagname'], tag['value'])
26             if sliver.get('sliver_id'):
27                 name = Xrn(xrn=sliver.get('sliver_id')
28                            ).get_hrn().split('.')[-1]
29                 sliver_elem.set('name', name)
30
31     @staticmethod
32     def add_sliver_attribute(xml, name, value):
33         elem = xml.add_element(name)
34         elem.set_text(value)
35
36     @staticmethod
37     def get_sliver_attributes(xml):
38         attribs = []
39         for elem in xml.iterchildren():
40             if elem.tag not in Sliver.fields:
41                 xml_element = XmlElement(elem, xml.namespaces)
42                 instance = Element(fields=xml_element, element=elem)
43                 instance['name'] = elem.tag
44                 instance['value'] = elem.text
45                 attribs.append(instance)
46         return attribs
47
48     @staticmethod
49     def get_slivers(xml, filter=None):
50         if filter is None:
51             filter = {}
52         xpath = './default:sliver | ./sliver'
53         sliver_elems = xml.xpath(xpath)
54         slivers = []
55         for sliver_elem in sliver_elems:
56             sliver = Sliver(sliver_elem.attrib, sliver_elem)
57             if 'component_id' in xml.attrib:
58                 sliver['component_id'] = xml.attrib['component_id']
59             sliver['tags'] = NITOSv1Sliver.get_sliver_attributes(sliver_elem)
60             slivers.append(sliver)
61         return slivers