e89d88edac56baa5dec581dbbdf9d63e60a3c065
[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         slice_nodes = self.driver.shell.GetNodes({'node_ids': slice['node_ids']})   
47         for node in slice_nodes:
48             slivers[node['node_id']] = node  
49
50         return (slice, slivers)
51
52     def get_nodes(self, slice_xrn, slice=None,slivers=[], options={}):
53         # if we are dealing with a slice that has no node just return 
54         # and empty list    
55         if slice_xrn:
56             if not slice or not slice['node_ids']:
57                 return []
58
59         filter = {}
60         if slice and 'node_ids' in slice and slice['node_ids']:
61             filter['node_ids'] = slice['node_ids']
62
63         nodes = self.driver.shell.GetNodes(filter)
64         
65         rspec_nodes = []
66         for node in nodes:
67             rspec_node = Node()
68             # xxx how to retrieve site['login_base']
69             site=self.driver.testbedInfo
70             rspec_node['component_id'] = hostname_to_urn(self.driver.hrn, site['name'], node['hostname'])
71             rspec_node['component_name'] = node['hostname']
72             rspec_node['component_manager_id'] = Xrn(self.driver.hrn, 'authority+cm').get_urn()
73             rspec_node['authority_id'] = hrn_to_urn(PlXrn.site_hrn(self.driver.hrn, site['name']), 'authority+sa')
74             rspec_node['exclusive'] = 'false'
75             rspec_node['hardware_types'] = [HardwareType({'name': 'plab-pc'}),
76                                             HardwareType({'name': 'pc'})]
77              # add site/interface info to nodes.
78             # assumes that sites, interfaces and tags have already been prepared.
79             if site['longitude'] and site['latitude']:  
80                 location = Location({'longitude': site['longitude'], 'latitude': site['latitude'], 'country': 'unknown'})
81                 rspec_node['location'] = location
82
83             if node['node_id'] in slivers:
84                 # add sliver info
85                 sliver = slivers[node['node_id']]
86                 rspec_node['client_id'] = node['hostname']
87                 rspec_node['slivers'] = [sliver]
88                 
89                 # slivers always provide the ssh service
90                 login = Login({'authentication': 'ssh-keys', 'hostname': node['hostname'], 'port':'22', 'username': slice['slice_name']})
91                 service = Services({'login': login})
92                 rspec_node['services'] = [service]
93             rspec_nodes.append(rspec_node)
94         return rspec_nodes
95              
96
97     
98     def get_rspec(self, slice_xrn=None, version = None, options={}):
99
100         version_manager = VersionManager()
101         version = version_manager.get_version(version)
102         if not slice_xrn:
103             rspec_version = version_manager._get_version(version.type, version.version, 'ad')
104         else:
105             rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
106
107         slice, slivers = self.get_slice_and_slivers(slice_xrn)
108         rspec = RSpec(version=rspec_version, user_options=options)
109         if slice and 'expires' in slice:
110             rspec.xml.set('expires',  datetime_to_string(utcparse(slice['expires'])))
111
112         nodes = self.get_nodes(slice_xrn, slice, slivers, options)
113         rspec.version.add_nodes(nodes)
114         rspec.version.add_links(links)
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