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