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
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
20 from sfa.dummy.dummyxrn import DummyXrn, hostname_to_urn, hrn_to_dummy_slicename, slicename_to_hrn
26 def __init__(self, driver):
29 def get_slice_and_slivers(self, slice_xrn):
31 Returns a dict of slivers keyed on the sliver's node_id
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})
42 return (slice, slivers)
45 # sort slivers by node id
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
52 return (slice, slivers)
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
58 if not slice or 'node_ids' not in slice.keys() or not slice['node_ids']:
62 if slice and 'node_ids' in slice and slice['node_ids']:
63 filter['node_ids'] = slice['node_ids']
65 nodes = self.driver.shell.GetNodes(filter)
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
85 if node['node_id'] in slivers:
87 sliver = slivers[node['node_id']]
88 rspec_node['client_id'] = node['hostname']
89 rspec_node['slivers'] = [sliver]
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)
100 def get_rspec(self, slice_xrn=None, version = None, options={}):
102 version_manager = VersionManager()
103 version = version_manager.get_version(version)
105 rspec_version = version_manager._get_version(version.type, version.version, 'ad')
107 rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
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'])))
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, [])
119 default_sliver_attribs = default_sliver.get('tags', [])
120 for attrib in default_sliver_attribs:
122 rspec.version.add_default_sliver_attribute(attrib['tagname'], attrib['value'])