from sfa.util.version import version_core
from sfa.util.cache import Cache
from sfa.rspecs.version_manager import VersionManager
+from sfa.client.return_value import ReturnValue
AGGREGATE_PORT=12346
CM_PORT=12346
version = cache.get(cache_key)
if not version:
- version = server.GetVersion()
+ result = server.GetVersion()
+ version= ReturnValue.get_value(result)
# cache version for 24 hours
cache.add(cache_key, version, ttl= 60*60*24)
self.logger.info("Updating cache file %s" % cache_file)
cache.save_to_file(cache_file)
-
return version
server=self.registry
else:
server = self.server_proxy_from_opts(opts)
- version=server.GetVersion()
+ result = server.GetVersion()
+ version = ReturnValue.get_value(result)
for (k,v) in version.iteritems():
print "%-20s: %s"%(k,v)
if opts.file:
if self.server_supports_options_arg(server):
options = {'call_id': unique_call_id()}
call_args.append(options)
- results = server.ListSlices(*call_args)
- display_list(results)
+ result = server.ListSlices(*call_args)
+ value = ReturnValue.get_value(result)
+ display_list(value)
return
# show rspec for named slice
call_args = [creds, options]
result = server.ListResources(*call_args)
+ value = ReturnValue.get_value(result)
if opts.file is None:
- display_rspec(result, opts.format)
+ display_rspec(value, opts.format)
else:
- save_rspec_to_file(result, opts.file)
+ save_rspec_to_file(value, opts.file)
return
# created named slice with given rspec
options = {'call_id': unique_call_id()}
call_args.append(options)
result = server.CreateSliver(*call_args)
+ value = ReturnValue.get_value(result)
if opts.file is None:
- print result
+ print value
else:
- save_rspec_to_file (result, opts.file)
- return result
+ save_rspec_to_file (value, opts.file)
+ return value
# get a ticket for the specified slice
def get_ticket(self, opts, args):
if self.server_supports_options_arg(server):
options = {'call_id': unique_call_id()}
call_args.append(options)
- return server.RenewSliver(*call_args)
+ result = server.RenewSliver(*call_args)
+ value = ReturnValue.get_value(result)
+ return value
def status(self, opts, args):
options = {'call_id': unique_call_id()}
call_args.append(options)
result = server.SliverStatus(*call_args)
- print result
+ value = ReturnValue.get_value(result)
+ print value
if opts.file:
- save_variable_to_file(result, opts.file, opts.fileformat)
+ save_variable_to_file(value, opts.file, opts.fileformat)
def shutdown(self, opts, args):
from sfa.util.xrn import Xrn, urn_to_hrn
from sfa.util.version import version_core
from sfa.util.callids import Callids
-
from sfa.server.threadmanager import ThreadManager
-
from sfa.rspecs.rspec_converter import RSpecConverter
from sfa.rspecs.version_manager import VersionManager
from sfa.rspecs.rspec import RSpec
from sfa.client.client_helper import sfa_to_pg_users_arg
+from sfa.client.return_value import ReturnValue
class SliceManager:
def __init__ (self):
# self.caching=False
self.caching=True
-
def _options_supported(self, api, server):
"""
Returns true if server support the optional call_id arg, false otherwise.
try:
version = api.get_cached_server_version(server)
# force ProtoGENI aggregates to give us a v2 RSpec
- if 'sfa' not in version.keys():
+ if 'sfa' in version.keys():
+ my_opts['rspec_version'] = version_manager.get_version('SFA 1').to_dict()
+ else:
my_opts['rspec_version'] = version_manager.get_version('ProtoGENI 2').to_dict()
rspec = server.ListResources(*args)
return {"aggregate": aggregate, "rspec": rspec, "elapsed": time.time()-tStart, "status": "success"}
self.add_slicemgr_stat(rspec, "ListResources", result["aggregate"], result["elapsed"], result["status"], result.get("exc_info",None))
if result["status"]=="success":
try:
- rspec.version.merge(result["rspec"])
+ rspec.version.merge(ReturnValue.get_value(result["rspec"]))
except:
api.logger.log_exc("SM.ListResources: Failed to merge aggregate rspec")
self.add_slicemgr_stat(result_rspec, "CreateSliver", result["aggregate"], result["elapsed"], result["status"], result.get("exc_info",None))
if result["status"]=="success":
try:
- result_rspec.version.merge(result["rspec"])
+ result_rspec.version.merge(ReturnValue.get_value(rresult["rspec"]))
except:
api.logger.log_exc("SM.CreateSliver: Failed to merge aggregate rspec")
return result_rspec.toxml()
server = api.server_proxy(interface, cred)
threads.run(_RenewSliver, server, xrn, [cred], expiration_time, call_id)
# 'and' the results
- return reduce (lambda x,y: x and y, threads.get_results() , True)
+ results = [ReturnValue.get_value(result) for result in threads.get_results()]
+ return reduce (lambda x,y: x and y, results , True)
def DeleteSliver(self, api, xrn, creds, options={}):
def _DeleteSliver(server, xrn, creds, options={}):
interface = api.aggregates[aggregate]
server = api.server_proxy(interface, cred)
threads.run (_SliverStatus, server, slice_xrn, [cred], call_id)
- results = threads.get_results()
+ results = [ReturnValue.get_value(result) for result in threads.get_results()]
# get rid of any void result - e.g. when call_id was hit where by convention we return {}
results = [ result for result in results if result and result['geni_resources']]
threads.run(_ListSlices, server, [cred], options)
# combime results
- results = threads.get_results()
+ results = [ReturnValue.get_value(result) for result in threads.get_results()]
slices = []
for result in results:
slices.extend(result)
if 'component_manager' in link and link['component_manager']:
cm_element = link_elem.add_element('component_manager', name=link['component_manager'])
# set interface_ref elements
- for if_ref in [link['interface1'], link['interface2']]:
- link_elem.add_instance('interface_ref', if_ref, Interface.fields)
- # set property elements
- prop1 = link_elem.add_element('property', source_id = link['interface1']['component_id'],
- dest_id = link['interface2']['component_id'], capacity=link['capacity'],
- latency=link['latency'], packet_loss=link['packet_loss'])
- prop2 = link_elem.add_element('property', source_id = link['interface2']['component_id'],
- dest_id = link['interface1']['component_id'], capacity=link['capacity'],
- latency=link['latency'], packet_loss=link['packet_loss'])
+ if link.get('interface1') and link.get('interface2'):
+ for if_ref in [link['interface1'], link['interface2']]:
+ link_elem.add_instance('interface_ref', if_ref, Interface.fields)
+ # set property elements
+ prop1 = link_elem.add_element('property', source_id = link['interface1']['component_id'],
+ dest_id = link['interface2']['component_id'], capacity=link['capacity'],
+ latency=link['latency'], packet_loss=link['packet_loss'])
+ prop2 = link_elem.add_element('property', source_id = link['interface2']['component_id'],
+ dest_id = link['interface1']['component_id'], capacity=link['capacity'],
+ latency=link['latency'], packet_loss=link['packet_loss'])
if link.get('type'):
type_elem = link_elem.add_element('link_type', name=link['type'])
# bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000)
PGv2Services.add_services(node_elem, node.get('services', []))
- for tag in node.get('tags', []):
- tag_elem = node_elem.add_element(tag['tagname'])
- tag_elem.set_text(tag['value'])
+ tags = node.get('tags', [])
+ if tags:
+ for tag in tags:
+ tag_elem = node_elem.add_element(tag['tagname'])
+ tag_elem.set_text(tag['value'])
SFAv1Sliver.add_slivers(node_elem, node.get('slivers', []))
@staticmethod
slivers = [slivers]
for sliver in slivers:
sliver_elem = xml.add_instance('sliver', sliver, ['name'])
- for tag in sliver.get('tags', []):
- SFAv1Sliver.add_sliver_attribute(sliver_elem, tag['tagname'], tag['value'])
+ tags = sliver.get('tags', [])
+ if tags:
+ for tag in tags:
+ SFAv1Sliver.add_sliver_attribute(sliver_elem, tag['tagname'], tag['value'])
if sliver.get('sliver_id'):
sliver_id_leaf = Xrn(sliver.get('sliver_id')).get_leaf()
sliver_id_parts = sliver_id_leaf.split(':')
sfa_version = version_manager._get_version('sfa', '1')
sfa_rspec = RSpec(version=sfa_version)
+ #nodes = pg_rspec.version.get_nodes()
+ #sfa_rspec.version.add_nodes(nodes())
+ #sfa_rspec.version.add_links(pg_rspec.version.get_links())
+ #return sfa_rspec.toxml()
+
# get network
- network_urn = pg_rspec.version.get_network()
- network, _ = urn_to_hrn(network_urn)
- network_element = sfa_rspec.xml.add_element('network', {'name': network, 'id': network})
+ networks = pg_rspec.version.get_networks()
+ network_hrn = networks[0]
+ network_element = sfa_rspec.xml.add_element('network', name=network_hrn, id=network_hrn)
# get nodes
pg_nodes_elements = pg_rspec.version.get_node_elements()
attribs = dict(pg_node_element.attrib.items())
attribs['id'] = 'n'+str(i)
- node_element = sfa_rspec.xml.add_element('node', attribs, parent=network_element)
+ node_element = network_element.add_element('node')
+ for attrib in attribs:
+ node_element.set(attrib, attribs[attrib])
urn = pg_node_element.xpath('@component_id', namespaces=pg_rspec.namespaces)
if urn:
urn = urn[0]
hostname = Xrn.urn_split(urn)[-1]
- hostname_element = sfa_rspec.xml.add_element('hostname', parent=node_element, text=hostname)
+ hostname_element = node_element.add_element('hostname')
+ hostname_element.set_text(hostname)
if hostname in nodes_with_slivers:
- sfa_rspec.xml.add_element('sliver', parent=node_element)
+ node_element.add_element('sliver')
- urn_element = sfa_rspec.xml.add_element('urn', parent=node_element, text=urn)
-
-
# just copy over remaining child elements
for child in pg_node_element.getchildren():
node_element.append(transform(child).getroot())
# Networks
def get_networks(self):
networks = set()
- nodes = self.xml.xpath('//default:node[@component_manager_id]', namespaces=self.namespaces)
+ nodes = self.xml.xpath('//default:node[@component_manager_id] | //node:[@component_manager_id]', namespaces=self.namespaces)
for node in nodes:
if 'component_manager_id' in node:
network_urn = node.get('component_manager_id')
import os, os.path
import datetime
-from sfa.util.faults import SfaAPIError
+from sfa.util.faults import SfaFault, SfaAPIError
from sfa.util.config import Config
from sfa.util.cache import Cache
from sfa.trust.auth import Auth
from sfa.trust.rights import determine_rights
from sfa.server.xmlrpcapi import XmlrpcApi
from sfa.util.genicode import GENICODE
+from sfa.client.return_value import ReturnValue
# thgen xxx fixme this is wrong all right, but temporary, will use generic
from sfa.util.table import SfaTable
if self.cache:
server_version = self.cache.get(cache_key)
if not server_version:
- server_version = server.GetVersion()
+ result = server.GetVersion()
+ server_version = ReturnValue.get_value(result)
# cache version for 24 hours
self.cache.add(cache_key, server_version, ttl= 60*60*24)
return server_version
'am_type': 'sfa',
'am_code': None,
}
- if isinstnace(result, SfaFault):
+ if isinstance(result, SfaFault):
code['geni_code'] = result.faultCode
code['am_code'] = result.faultCode
def get_geni_output(self, result):
output = ""
- if isinstance(result, SFaFault):
+ if isinstance(result, SfaFault):
output = result.faultString
return output
"""
if self.interface.lower() == 'aggregate':
if hasattr(self.config, 'SFA_AGGREGATE_API_VERSION') and \
- self.config.SFA_AGGREGATE_API_VERSION == "2":
+ self.config.SFA_AGGREGATE_API_VERSION == 2:
result = self.prepare_response_v2_am(result)
return XmlrpcApi.prepare_response(self, result, method)
if not hasattr(self, 'SFA_MAX_SLICE_RENEW'):
self.SFA_MAX_SLICE_RENEW=60
+ if not hasattr(self, 'SFA_AGGREGATE_API_VERSION'):
+ self.SFA_AGGREGATE_API_VERSION=1
+
# create the data directory if it doesnt exist
if not os.path.isdir(self.SFA_DATA_DIR):
try: