Dummy driver bug fixing again
[sfa.git] / sfa / dummy / dummyaggregate.py
1 #!/usr/bin/python
2 from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn
3 from sfa.util.sfatime import utcparse, datetime_to_string
4 from sfa.util.sfalogging import logger
5
6 from sfa.rspecs.rspec import RSpec
7 from sfa.rspecs.elements.hardware_type import HardwareType
8 from sfa.rspecs.elements.node import Node
9 from sfa.rspecs.elements.link import Link
10 from sfa.rspecs.elements.sliver import Sliver
11 from sfa.rspecs.elements.login import Login
12 from sfa.rspecs.elements.location import Location
13 from sfa.rspecs.elements.interface import Interface
14 from sfa.rspecs.elements.services import Services
15 from sfa.rspecs.elements.pltag import PLTag
16 from sfa.rspecs.elements.lease import Lease
17 from sfa.rspecs.elements.granularity import Granularity
18 from sfa.rspecs.version_manager import VersionManager
19
20 from sfa.dummy.dummyxrn import DummyXrn, hostname_to_urn, hrn_to_dummy_slicename, slicename_to_hrn
21
22 import time
23
24 class DummyAggregate:
25
26     def __init__(self, driver):
27         self.driver = driver
28
29     def get_slice_and_slivers(self, slice_xrn):
30         """
31         Returns a dict of slivers keyed on the sliver's node_id
32         """
33         slivers = {}
34         slice = None
35         if not slice_xrn:
36             return (slice, slivers)
37         slice_urn = hrn_to_urn(slice_xrn, 'slice')
38         slice_hrn, _ = urn_to_hrn(slice_xrn)
39         slice_name = hrn_to_dummy_slicename(slice_hrn)
40         slices = self.driver.shell.GetSlices({'slice_name': slice_name})
41         if not slices:
42             return (slice, slivers)
43         slice = slices[0]
44         
45         # sort slivers by node id 
46         if 'node_ids' in slice.keys():
47             slice_nodes = self.driver.shell.GetNodes({'node_ids': slice['node_ids']}) 
48         for node in slice_nodes:
49             slivers[node['node_id']] = node  
50
51         return (slice, slivers)
52
53     def get_nodes(self, slice_xrn, slice=None,slivers=[], options={}):
54         # if we are dealing with a slice that has no node just return 
55         # and empty list    
56         if slice_xrn:
57             if not slice or 'node_ids' not in slice.keys() or not slice['node_ids']:
58                 return []
59
60         filter = {}
61         if slice and 'node_ids' in slice and slice['node_ids']:
62             filter['node_ids'] = slice['node_ids']
63
64         nodes = self.driver.shell.GetNodes(filter)
65         
66         rspec_nodes = []
67         for node in nodes:
68             rspec_node = Node()
69             # xxx how to retrieve site['login_base']
70             site=self.driver.testbedInfo
71             rspec_node['component_id'] = hostname_to_urn(self.driver.hrn, site['name'], node['hostname'])
72             rspec_node['component_name'] = node['hostname']
73             rspec_node['component_manager_id'] = Xrn(self.driver.hrn, 'authority+cm').get_urn()
74             rspec_node['authority_id'] = hrn_to_urn(DummyXrn.site_hrn(self.driver.hrn, site['name']), 'authority+sa')
75             rspec_node['exclusive'] = 'false'
76             rspec_node['hardware_types'] = [HardwareType({'name': 'plab-pc'}),
77                                             HardwareType({'name': 'pc'})]
78              # add site/interface info to nodes.
79             # assumes that sites, interfaces and tags have already been prepared.
80             if site['longitude'] and site['latitude']:  
81                 location = Location({'longitude': site['longitude'], 'latitude': site['latitude'], 'country': 'unknown'})
82                 rspec_node['location'] = location
83
84             if node['node_id'] in slivers:
85                 # add sliver info
86                 sliver = slivers[node['node_id']]
87                 rspec_node['client_id'] = node['hostname']
88                 rspec_node['slivers'] = [sliver]
89                 
90                 # slivers always provide the ssh service
91                 login = Login({'authentication': 'ssh-keys', 'hostname': node['hostname'], 'port':'22', 'username': slice['slice_name']})
92                 service = Services({'login': login})
93                 rspec_node['services'] = [service]
94             rspec_nodes.append(rspec_node)
95         return rspec_nodes
96              
97
98     
99     def get_rspec(self, slice_xrn=None, version = None, options={}):
100
101         version_manager = VersionManager()
102         version = version_manager.get_version(version)
103         if not slice_xrn:
104             rspec_version = version_manager._get_version(version.type, version.version, 'ad')
105         else:
106             rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
107
108         slice, slivers = self.get_slice_and_slivers(slice_xrn)
109         rspec = RSpec(version=rspec_version, user_options=options)
110         if slice and 'expires' in slice:
111             rspec.xml.set('expires',  datetime_to_string(utcparse(slice['expires'])))
112
113         nodes = self.get_nodes(slice_xrn, slice, slivers, options)
114         rspec.version.add_nodes(nodes)
115         # add sliver defaults
116         default_sliver = slivers.get(None, [])
117         if default_sliver:
118             default_sliver_attribs = default_sliver.get('tags', [])
119             for attrib in default_sliver_attribs:
120                  logger.info(attrib)
121                  rspec.version.add_default_sliver_attribute(attrib['tagname'], attrib['value'])
122         
123         return rspec.toxml()
124
125