huge cleanup for removing mutables used as default
authorThierry Parmentelat <thierry.parmentelat@inria.fr>
Thu, 17 Jul 2014 11:14:15 +0000 (13:14 +0200)
committerThierry Parmentelat <thierry.parmentelat@inria.fr>
Thu, 17 Jul 2014 11:14:15 +0000 (13:14 +0200)
http://stackoverflow.com/questions/1132941/least-astonishment-in-python-the-mutable-default-argument

58 files changed:
sfa/cortexlab/cortexlabaggregate.py
sfa/cortexlab/cortexlabdriver.py
sfa/cortexlab/cortexlabslices.py
sfa/dummy/dummy_testbed_api.py
sfa/dummy/dummyaggregate.py
sfa/dummy/dummydriver.py
sfa/dummy/dummyslices.py
sfa/iotlab/iotlabaggregate.py
sfa/iotlab/iotlabdriver.py
sfa/iotlab/iotlabslices.py
sfa/managers/aggregate_manager.py
sfa/managers/driver.py
sfa/managers/registry_manager.py
sfa/managers/slice_manager.py
sfa/methods/GetVersion.py
sfa/methods/List.py
sfa/methods/Resolve.py
sfa/nitos/nitosaggregate.py
sfa/nitos/nitosslices.py
sfa/openstack/image.py
sfa/openstack/nova_driver.py
sfa/openstack/osaggregate.py
sfa/planetlab/plaggregate.py
sfa/planetlab/pldriver.py
sfa/planetlab/plslices.py
sfa/rspecs/elements/element.py
sfa/rspecs/elements/versions/iotlabv1Lease.py
sfa/rspecs/elements/versions/iotlabv1Node.py
sfa/rspecs/elements/versions/iotlabv1Sliver.py
sfa/rspecs/elements/versions/nitosv1Channel.py
sfa/rspecs/elements/versions/nitosv1Lease.py
sfa/rspecs/elements/versions/nitosv1Node.py
sfa/rspecs/elements/versions/nitosv1PLTag.py
sfa/rspecs/elements/versions/nitosv1Sliver.py
sfa/rspecs/elements/versions/ofeliav1Port.py
sfa/rspecs/elements/versions/ofeliav1datapath.py
sfa/rspecs/elements/versions/ofeliav1link.py
sfa/rspecs/elements/versions/pgv2DiskImage.py
sfa/rspecs/elements/versions/pgv2Lease.py
sfa/rspecs/elements/versions/pgv2Node.py
sfa/rspecs/elements/versions/pgv2SliverType.py
sfa/rspecs/elements/versions/sfav1Lease.py
sfa/rspecs/elements/versions/sfav1Node.py
sfa/rspecs/elements/versions/sfav1PLTag.py
sfa/rspecs/elements/versions/sfav1Sliver.py
sfa/rspecs/rspec.py
sfa/rspecs/versions/iotlabv1.py
sfa/rspecs/versions/nitosv1.py
sfa/rspecs/versions/ofeliav1.py
sfa/rspecs/versions/pgv2.py
sfa/rspecs/versions/sfav1.py
sfa/storage/model.py
sfa/storage/record.py
sfa/util/config.py
sfa/util/storage.py
sfa/util/version.py.in
sfa/util/xml.py
sfa/util/xrn.py

index d9cddf3..24a5310 100644 (file)
@@ -292,7 +292,7 @@ class CortexlabAggregate:
         return rspec_node
 
 
         return rspec_node
 
 
-    def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations = {}):
+    def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations=None):
         """Makes a geni sliver structure from all the nodes allocated
         to slivers in the sliver_allocations dictionary. Returns the states
         of the sliver.
         """Makes a geni sliver structure from all the nodes allocated
         to slivers in the sliver_allocations dictionary. Returns the states
         of the sliver.
@@ -312,6 +312,8 @@ class CortexlabAggregate:
         .. seealso:: node_to_rspec_node
 
         """
         .. seealso:: node_to_rspec_node
 
         """
+        if sliver_allocations is None: sliver_allocations={}
+
         if rspec_node['sliver_id'] in sliver_allocations:
             # set sliver allocation and operational status
             sliver_allocation = sliver_allocations[rspec_node['sliver_id']]
         if rspec_node['sliver_id'] in sliver_allocations:
             # set sliver allocation and operational status
             sliver_allocation = sliver_allocations[rspec_node['sliver_id']]
@@ -555,7 +557,7 @@ class CortexlabAggregate:
 
 
 
 
 
 
-    def get_slivers(self, urns, options={}):
+    def get_slivers(self, urns, options=None):
         """Get slivers of the given slice urns. Slivers contains slice, node and
         user information.
 
         """Get slivers of the given slice urns. Slivers contains slice, node and
         user information.
 
@@ -569,7 +571,7 @@ class CortexlabAggregate:
 
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3/CommonConcepts#urns
         """
 
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3/CommonConcepts#urns
         """
-
+        if options is None: options={}
 
         slice_ids = set()
         node_ids = []
 
         slice_ids = set()
         node_ids = []
@@ -667,7 +669,7 @@ class CortexlabAggregate:
         return slivers
 
 
         return slivers
 
 
-    def list_resources(self, version = None, options={}):
+    def list_resources(self, version = None, options=None):
         """
         Returns an advertisement Rspec of available resources at this
         aggregate. This Rspec contains a resource listing along with their
         """
         Returns an advertisement Rspec of available resources at this
         aggregate. This Rspec contains a resource listing along with their
@@ -688,6 +690,8 @@ class CortexlabAggregate:
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3#ListResources
         """
 
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3#ListResources
         """
 
+        if options is None: options={}
+
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(version.type,
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(version.type,
@@ -722,7 +726,7 @@ class CortexlabAggregate:
         return rspec.toxml()
 
 
         return rspec.toxml()
 
 
-    def describe(self, urns, version=None, options={}):
+    def describe(self, urns, version=None, options=None):
         """
         Retrieve a manifest RSpec describing the resources contained by the
         named entities, e.g. a single slice or a set of the slivers in a slice.
         """
         Retrieve a manifest RSpec describing the resources contained by the
         named entities, e.g. a single slice or a set of the slivers in a slice.
@@ -752,6 +756,7 @@ class CortexlabAggregate:
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3#Describe
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3/CommonConcepts#urns
         """
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3#Describe
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3/CommonConcepts#urns
         """
+        if options is None: options={}
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(
index bc674f7..c5ad4e6 100644 (file)
@@ -1081,7 +1081,7 @@ class CortexlabDriver(Driver):
 
 
 
 
 
 
-    def delete(self, slice_urns, options={}):
+    def delete(self, slice_urns, options=None):
         """
         Deletes the lease associated with the slice hrn and the credentials
             if the slice belongs to iotlab. Answer to DeleteSliver.
         """
         Deletes the lease associated with the slice hrn and the credentials
             if the slice belongs to iotlab. Answer to DeleteSliver.
@@ -1099,6 +1099,7 @@ class CortexlabDriver(Driver):
         .. note:: creds are unused, and are not used either in the dummy driver
              delete_sliver .
         """
         .. note:: creds are unused, and are not used either in the dummy driver
              delete_sliver .
         """
+        if options is None: options={}
         # collect sliver ids so we can update sliver allocation states after
         # we remove the slivers.
         aggregate = CortexlabAggregate(self)
         # collect sliver ids so we can update sliver allocation states after
         # we remove the slivers.
         aggregate = CortexlabAggregate(self)
@@ -1390,17 +1391,20 @@ class CortexlabDriver(Driver):
 
 
     # first 2 args are None in case of resource discovery
 
 
     # first 2 args are None in case of resource discovery
-    def list_resources (self, version=None, options={}):
+    def list_resources (self, version=None, options=None):
+        if options is None: options={}
         aggregate = CortexlabAggregate(self)
         rspec =  aggregate.list_resources(version=version, options=options)
         return rspec
 
 
         aggregate = CortexlabAggregate(self)
         rspec =  aggregate.list_resources(version=version, options=options)
         return rspec
 
 
-    def describe(self, urns, version, options={}):
+    def describe(self, urns, version, options=None):
+        if options is None: options={}
         aggregate = CortexlabAggregate(self)
         return aggregate.describe(urns, version=version, options=options)
 
         aggregate = CortexlabAggregate(self)
         return aggregate.describe(urns, version=version, options=options)
 
-    def status (self, urns, options={}):
+    def status (self, urns, options=None):
+        if options is None: options={}
         aggregate = CortexlabAggregate(self)
         desc =  aggregate.describe(urns, version='GENI 3')
         status = {'geni_urn': desc['geni_urn'],
         aggregate = CortexlabAggregate(self)
         desc =  aggregate.describe(urns, version='GENI 3')
         status = {'geni_urn': desc['geni_urn'],
@@ -1408,7 +1412,8 @@ class CortexlabDriver(Driver):
         return status
 
 
         return status
 
 
-    def allocate (self, urn, rspec_string, expiration, options={}):
+    def allocate (self, urn, rspec_string, expiration, options=None):
+        if options is None: options={}
         xrn = Xrn(urn)
         aggregate = CortexlabAggregate(self)
 
         xrn = Xrn(urn)
         aggregate = CortexlabAggregate(self)
 
@@ -1488,7 +1493,8 @@ class CortexlabDriver(Driver):
 
         return aggregate.describe([xrn.get_urn()], version=rspec.version)
 
 
         return aggregate.describe([xrn.get_urn()], version=rspec.version)
 
-    def provision(self, urns, options={}):
+    def provision(self, urns, options=None):
+        if options is None: options={}
         # update users
         slices = CortexlabSlices(self)
         aggregate = CortexlabAggregate(self)
         # update users
         slices = CortexlabSlices(self)
         aggregate = CortexlabAggregate(self)
index ee160d4..888d7db 100644 (file)
@@ -351,7 +351,7 @@ class CortexlabSlices:
         return sfa_slice
 
 
         return sfa_slice
 
 
-    def verify_persons(self, slice_hrn, slice_record, users, options={}):
+    def verify_persons(self, slice_hrn, slice_record, users, options=None):
         """Ensures the users in users list exist and are enabled in LDAP. Adds
         person if needed(AddPerson).
 
         """Ensures the users in users list exist and are enabled in LDAP. Adds
         person if needed(AddPerson).
 
@@ -378,6 +378,7 @@ class CortexlabSlices:
 
         """
 
 
         """
 
+        if options is None: options={}
 
         logger.debug("CortexlabSlices \tverify_persons \tslice_hrn  %s  \
                     \t slice_record %s\r\n users %s \t  "
 
         logger.debug("CortexlabSlices \tverify_persons \tslice_hrn  %s  \
                     \t slice_record %s\r\n users %s \t  "
@@ -525,10 +526,11 @@ class CortexlabSlices:
         return added_persons
 
 
         return added_persons
 
 
-    def verify_keys(self, persons, users, peer, options={}):
+    def verify_keys(self, persons, users, peer, options=None):
         """
         .. warning:: unused
         """
         """
         .. warning:: unused
         """
+        if options is None: options={}
         # existing keys
         key_ids = []
         for person in persons:
         # existing keys
         key_ids = []
         for person in persons:
index 2673166..f553e40 100644 (file)
@@ -12,7 +12,12 @@ for i in range(1,11):
 
 slices_list = []
 for i in range(1,3):
 
 slices_list = []
 for i in range(1,3):
-    slice = {'slice_name': 'slice'+str(i), 'user_ids': range(i,4,2), 'slice_id': i, 'node_ids': range(i,10,2), 'enabled': True, 'expires': int(time.time())+60*60*24*30}
+    slice = {'slice_name': 'slice'+str(i), 
+             'user_ids': range(i,4,2), 
+             'slice_id': i, 
+             'node_ids': range(i,10,2),
+             'enabled': True,
+             'expires': int(time.time())+60*60*24*30}
     slices_list.append(slice)
 
 users_list = []
     slices_list.append(slice)
 
 users_list = []
@@ -43,7 +48,8 @@ def FilterList(myfilter, mylist):
 def GetTestbedInfo():
     return {'name': 'dummy', 'longitude': 123456, 'latitude': 654321, 'domain':'dummy-testbed.org'}
 
 def GetTestbedInfo():
     return {'name': 'dummy', 'longitude': 123456, 'latitude': 654321, 'domain':'dummy-testbed.org'}
 
-def GetNodes(filter={}):
+def GetNodes(filter=None):
+    if filter is None: filter={}
     global DB
     result = []
     result.extend(DB['nodes_list'])
     global DB
     result = []
     result.extend(DB['nodes_list'])
@@ -55,7 +61,8 @@ def GetNodes(filter={}):
         result = FilterList(filter, result)
     return result
 
         result = FilterList(filter, result)
     return result
 
-def GetSlices(filter={}):
+def GetSlices(filter=None):
+    if filter is None: filter={}
     global DB
     result = []
     result.extend(DB['slices_list'])
     global DB
     result = []
     result.extend(DB['slices_list'])
@@ -69,7 +76,8 @@ def GetSlices(filter={}):
     return result
 
 
     return result
 
 
-def GetUsers(filter={}):
+def GetUsers(filter=None):
+    if filter is None: filter={}
     global DB
     result = []
     result.extend(DB['users_list'])
     global DB
     result = []
     result.extend(DB['users_list'])
index 576ccd5..c5b4d10 100644 (file)
@@ -52,12 +52,14 @@ class DummyAggregate:
 
         return (slice, slivers)
 
 
         return (slice, slivers)
 
-    def get_nodes(self, options={}):
+    def get_nodes(self, options=None):
+        if options is None: options={}
         filter = {}
         nodes = self.driver.shell.GetNodes(filter)
         return nodes
 
         filter = {}
         nodes = self.driver.shell.GetNodes(filter)
         return nodes
 
-    def get_slivers(self, urns, options={}):
+    def get_slivers(self, urns, options=None):
+        if options is None: options={}
         slice_names = set()
         slice_ids = set()
         node_ids = []
         slice_names = set()
         slice_ids = set()
         node_ids = []
@@ -122,7 +124,8 @@ class DummyAggregate:
             slivers.append(node)
         return slivers
 
             slivers.append(node)
         return slivers
 
-    def node_to_rspec_node(self, node, options={}):
+    def node_to_rspec_node(self, node, options=None):
+        if options is None: options={}
         rspec_node = NodeElement()
         site=self.driver.testbedInfo
         rspec_node['component_id'] = hostname_to_urn(self.driver.hrn, site['name'], node['hostname'])
         rspec_node = NodeElement()
         site=self.driver.testbedInfo
         rspec_node['component_id'] = hostname_to_urn(self.driver.hrn, site['name'], node['hostname'])
@@ -163,7 +166,8 @@ class DummyAggregate:
                       })
         return rspec_node
 
                       })
         return rspec_node
 
-    def get_slice_nodes(self, slice, options={}):
+    def get_slice_nodes(self, slice, options=None):
+        if options is None: options={}
         nodes_dict = {}
         filter = {}
         if slice and slice.get('node_ids'):
         nodes_dict = {}
         filter = {}
         if slice and slice.get('node_ids'):
@@ -176,7 +180,8 @@ class DummyAggregate:
             nodes_dict[node['node_id']] = node
         return nodes_dict
 
             nodes_dict[node['node_id']] = node
         return nodes_dict
 
-    def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations = {}):
+    def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations = None):
+        if sliver_allocations is None: sliver_allocations={}
         if rspec_node['sliver_id'] in sliver_allocations:
             # set sliver allocation and operational status
             sliver_allocation = sliver_allocations[rspec_node['sliver_id']]
         if rspec_node['sliver_id'] in sliver_allocations:
             # set sliver allocation and operational status
             sliver_allocation = sliver_allocations[rspec_node['sliver_id']]
@@ -202,7 +207,8 @@ class DummyAggregate:
                        }
         return geni_sliver
 
                        }
         return geni_sliver
 
-    def list_resources(self, version = None, options={}):
+    def list_resources(self, version = None, options=None):
+        if options is None: options={}
 
         version_manager = VersionManager()
         version = version_manager.get_version(version)
 
         version_manager = VersionManager()
         version = version_manager.get_version(version)
@@ -224,7 +230,8 @@ class DummyAggregate:
 
         return rspec.toxml()
 
 
         return rspec.toxml()
 
-    def describe(self, urns, version=None, options={}):
+    def describe(self, urns, version=None, options=None):
+        if options is None: options={}
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
index 4d7f7a3..a69662e 100644 (file)
@@ -412,16 +412,19 @@ class DummyDriver (Driver):
     def aggregate_version (self):
         return {}
 
     def aggregate_version (self):
         return {}
 
-    def list_resources (self, version=None, options={}):
+    def list_resources (self, version=None, options=None):
+        if options is None: options={}
         aggregate = DummyAggregate(self)
         rspec =  aggregate.list_resources(version=version, options=options)
         return rspec
 
         aggregate = DummyAggregate(self)
         rspec =  aggregate.list_resources(version=version, options=options)
         return rspec
 
-    def describe(self, urns, version, options={}):
+    def describe(self, urns, version, options=None):
+        if options is None: options={}
         aggregate = DummyAggregate(self)
         return aggregate.describe(urns, version=version, options=options)
     
         aggregate = DummyAggregate(self)
         return aggregate.describe(urns, version=version, options=options)
     
-    def status (self, urns, options={}):
+    def status (self, urns, options=None):
+        if options is None: options={}
         aggregate = DummyAggregate(self)
         desc =  aggregate.describe(urns, version='GENI 3')
         status = {'geni_urn': desc['geni_urn'],
         aggregate = DummyAggregate(self)
         desc =  aggregate.describe(urns, version='GENI 3')
         status = {'geni_urn': desc['geni_urn'],
@@ -429,7 +432,8 @@ class DummyDriver (Driver):
         return status
 
         
         return status
 
         
-    def allocate (self, urn, rspec_string, expiration, options={}):
+    def allocate (self, urn, rspec_string, expiration, options=None):
+        if options is None: options={}
         xrn = Xrn(urn)
         aggregate = DummyAggregate(self)
         slices = DummySlices(self)
         xrn = Xrn(urn)
         aggregate = DummyAggregate(self)
         slices = DummySlices(self)
@@ -453,7 +457,8 @@ class DummyDriver (Driver):
 
         return aggregate.describe([xrn.get_urn()], version=rspec.version)
 
 
         return aggregate.describe([xrn.get_urn()], version=rspec.version)
 
-    def provision(self, urns, options={}):
+    def provision(self, urns, options=None):
+        if options is None: options={}
         # update users
         slices = DummySlices(self)
         aggregate = DummyAggregate(self)
         # update users
         slices = DummySlices(self)
         aggregate = DummyAggregate(self)
@@ -469,7 +474,8 @@ class DummyDriver (Driver):
         rspec_version = version_manager.get_version(options['geni_rspec_version'])
         return self.describe(urns, rspec_version, options=options)
 
         rspec_version = version_manager.get_version(options['geni_rspec_version'])
         return self.describe(urns, rspec_version, options=options)
 
-    def delete(self, urns, options={}):
+    def delete(self, urns, options=None):
+        if options is None: options={}
         # collect sliver ids so we can update sliver allocation states after
         # we remove the slivers.
         aggregate = DummyAggregate(self)
         # collect sliver ids so we can update sliver allocation states after
         # we remove the slivers.
         aggregate = DummyAggregate(self)
@@ -504,7 +510,8 @@ class DummyDriver (Driver):
                  'geni_expires': datetime_to_string(utcparse(sliver['expires']))})  
         return geni_slivers
 
                  'geni_expires': datetime_to_string(utcparse(sliver['expires']))})  
         return geni_slivers
 
-    def renew (self, urns, expiration_time, options={}):
+    def renew (self, urns, expiration_time, options=None):
+        if options is None: options={}
         aggregate = DummyAggregate(self)
         slivers = aggregate.get_slivers(urns)
         if not slivers:
         aggregate = DummyAggregate(self)
         slivers = aggregate.get_slivers(urns)
         if not slivers:
@@ -516,7 +523,8 @@ class DummyDriver (Driver):
         description = self.describe(urns, 'GENI 3', options)
         return description['geni_slivers']
 
         description = self.describe(urns, 'GENI 3', options)
         return description['geni_slivers']
 
-    def perform_operational_action (self, urns, action, options={}):
+    def perform_operational_action (self, urns, action, options=None):
+        if options is None: options={}
         # Dummy doesn't support operational actions. Lets pretend like it
         # supports start, but reject everything else.
         action = action.lower()
         # Dummy doesn't support operational actions. Lets pretend like it
         # supports start, but reject everything else.
         action = action.lower()
@@ -535,7 +543,8 @@ class DummyDriver (Driver):
         geni_slivers = self.describe(urns, 'GENI 3', options)['geni_slivers']
         return geni_slivers
 
         geni_slivers = self.describe(urns, 'GENI 3', options)['geni_slivers']
         return geni_slivers
 
-    def shutdown (self, xrn, options={}):
+    def shutdown (self, xrn, options=None):
+        if options is None: options={}
         xrn = DummyXrn(xrn=xrn, type='slice')
         slicename = xrn.pl_slicename()
         slices = self.shell.GetSlices({'name': slicename}, ['slice_id'])
         xrn = DummyXrn(xrn=xrn, type='slice')
         slicename = xrn.pl_slicename()
         slices = self.shell.GetSlices({'name': slicename}, ['slice_id'])
index cf5a6da..7ab94ba 100644 (file)
@@ -110,7 +110,8 @@ class DummySlices:
         return resulting_nodes
         
 
         return resulting_nodes
         
 
-    def verify_slice(self, slice_hrn, slice_record, expiration, options={}):
+    def verify_slice(self, slice_hrn, slice_record, expiration, options=None):
+        if options is None: options={}
         slicename = hrn_to_dummy_slicename(slice_hrn)
         parts = slicename.split("_")
         login_base = parts[0]
         slicename = hrn_to_dummy_slicename(slice_hrn)
         parts = slicename.split("_")
         login_base = parts[0]
@@ -130,7 +131,8 @@ class DummySlices:
        
         return slice
 
        
         return slice
 
-    def verify_users(self, slice_hrn, slice_record, users, options={}):
+    def verify_users(self, slice_hrn, slice_record, users, options=None):
+        if options is None: options={}
         slice_name = hrn_to_dummy_slicename(slice_hrn)
         users_by_email = {}
         for user in users:
         slice_name = hrn_to_dummy_slicename(slice_hrn)
         users_by_email = {}
         for user in users:
@@ -162,7 +164,8 @@ class DummySlices:
             pass
             
 
             pass
             
 
-    def verify_keys(self, old_users, new_users, options={}):
+    def verify_keys(self, old_users, new_users, options=None):
+        if options is None: options={}
         # existing keys 
         existing_keys = []
         for user in old_users:
         # existing keys 
         existing_keys = []
         for user in old_users:
index 34eb38f..56e40e4 100644 (file)
@@ -306,7 +306,7 @@ class IotlabAggregate:
         return rspec_node
 
 
         return rspec_node
 
 
-    def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations = {}):
+    def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations = None):
         """Makes a geni sliver structure from all the nodes allocated
         to slivers in the sliver_allocations dictionary. Returns the states
         of the sliver.
         """Makes a geni sliver structure from all the nodes allocated
         to slivers in the sliver_allocations dictionary. Returns the states
         of the sliver.
@@ -326,6 +326,7 @@ class IotlabAggregate:
         .. seealso:: node_to_rspec_node
 
         """
         .. seealso:: node_to_rspec_node
 
         """
+        if sliver_allocations is None: sliver_allocations={}
         if rspec_node['sliver_id'] in sliver_allocations:
             # set sliver allocation and operational status
             sliver_allocation = sliver_allocations[rspec_node['sliver_id']]
         if rspec_node['sliver_id'] in sliver_allocations:
             # set sliver allocation and operational status
             sliver_allocation = sliver_allocations[rspec_node['sliver_id']]
@@ -400,7 +401,8 @@ class IotlabAggregate:
         return rspec_node
 
 
         return rspec_node
 
 
-    def get_leases(self, slice=None, options={}):
+    def get_leases(self, slice=None, options=None):
+        if options is None: options={}
         filter={}
         if slice:
            filter.update({'name':slice['slice_name']})
         filter={}
         if slice:
            filter.update({'name':slice['slice_name']})
@@ -598,7 +600,7 @@ class IotlabAggregate:
                        FINAL RSPEC %s \r\n" % (rspec.toxml()))
         return rspec.toxml()
 
                        FINAL RSPEC %s \r\n" % (rspec.toxml()))
         return rspec.toxml()
 
-    def get_slivers(self, urns, options={}):
+    def get_slivers(self, urns, options=None):
         """Get slivers of the given slice urns. Slivers contains slice, node and
         user information.
 
         """Get slivers of the given slice urns. Slivers contains slice, node and
         user information.
 
@@ -613,7 +615,7 @@ class IotlabAggregate:
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3/CommonConcepts#urns
         """
 
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3/CommonConcepts#urns
         """
 
-
+        if options is None: options={}
         slice_ids = set()
         node_ids = []
         for urn in urns:
         slice_ids = set()
         node_ids = []
         for urn in urns:
@@ -709,7 +711,7 @@ class IotlabAggregate:
                 slivers.append(node)
         return slivers
 
                 slivers.append(node)
         return slivers
 
-    def list_resources(self, version = None, options={}):
+    def list_resources(self, version = None, options=None):
         """
         Returns an advertisement Rspec of available resources at this
         aggregate. This Rspec contains a resource listing along with their
         """
         Returns an advertisement Rspec of available resources at this
         aggregate. This Rspec contains a resource listing along with their
@@ -730,6 +732,7 @@ class IotlabAggregate:
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3#ListResources
         """
 
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3#ListResources
         """
 
+        if options is None: options={}
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(version.type,
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(version.type,
@@ -764,7 +767,7 @@ class IotlabAggregate:
         return rspec.toxml()
 
 
         return rspec.toxml()
 
 
-    def describe(self, urns, version=None, options={}):
+    def describe(self, urns, version=None, options=None):
         """
         Retrieve a manifest RSpec describing the resources contained by the
         named entities, e.g. a single slice or a set of the slivers in a slice.
         """
         Retrieve a manifest RSpec describing the resources contained by the
         named entities, e.g. a single slice or a set of the slivers in a slice.
@@ -794,6 +797,7 @@ class IotlabAggregate:
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3#Describe
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3/CommonConcepts#urns
         """
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3#Describe
         .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3/CommonConcepts#urns
         """
+        if options is None: options={}
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(
index eb055d9..797f156 100644 (file)
@@ -1088,7 +1088,7 @@ class IotlabDriver(Driver):
 
 
 
 
 
 
-    def delete(self, slice_urns, options={}):
+    def delete(self, slice_urns, options=None):
         """
         Deletes the lease associated with the slice hrn and the credentials
             if the slice belongs to iotlab. Answer to DeleteSliver.
         """
         Deletes the lease associated with the slice hrn and the credentials
             if the slice belongs to iotlab. Answer to DeleteSliver.
@@ -1106,6 +1106,7 @@ class IotlabDriver(Driver):
         .. note:: creds are unused, and are not used either in the dummy driver
              delete_sliver .
         """
         .. note:: creds are unused, and are not used either in the dummy driver
              delete_sliver .
         """
+        if options is None: options={}
         # collect sliver ids so we can update sliver allocation states after
         # we remove the slivers.
         aggregate = IotlabAggregate(self)
         # collect sliver ids so we can update sliver allocation states after
         # we remove the slivers.
         aggregate = IotlabAggregate(self)
@@ -1398,16 +1399,19 @@ class IotlabDriver(Driver):
             'geni_ad_rspec_versions': ad_rspec_versions}
 
     # first 2 args are None in case of resource discovery
             'geni_ad_rspec_versions': ad_rspec_versions}
 
     # first 2 args are None in case of resource discovery
-    def list_resources (self, version=None, options={}):
+    def list_resources (self, version=None, options=None):
+        if options is None: options={}
         aggregate = IotlabAggregate(self)
         rspec =  aggregate.list_resources(version=version, options=options)
         return rspec
 
         aggregate = IotlabAggregate(self)
         rspec =  aggregate.list_resources(version=version, options=options)
         return rspec
 
-    def describe(self, urns, version, options={}):
+    def describe(self, urns, version, options=None):
+        if options is None: options={}
         aggregate = IotlabAggregate(self)
         return aggregate.describe(urns, version=version, options=options)
 
         aggregate = IotlabAggregate(self)
         return aggregate.describe(urns, version=version, options=options)
 
-    def status (self, urns, options={}):
+    def status (self, urns, options=None):
+        if options is None: options={}
         aggregate = IotlabAggregate(self)
         desc =  aggregate.describe(urns, version='GENI 3')
         status = {'geni_urn': desc['geni_urn'],
         aggregate = IotlabAggregate(self)
         desc =  aggregate.describe(urns, version='GENI 3')
         status = {'geni_urn': desc['geni_urn'],
@@ -1415,7 +1419,8 @@ class IotlabDriver(Driver):
         return status
 
 
         return status
 
 
-    def allocate (self, urn, rspec_string, expiration, options={}):
+    def allocate (self, urn, rspec_string, expiration, options=None):
+        if options is None: options={}
         xrn = Xrn(urn)
         aggregate = IotlabAggregate(self)
 
         xrn = Xrn(urn)
         aggregate = IotlabAggregate(self)
 
@@ -1529,7 +1534,8 @@ class IotlabDriver(Driver):
 
         return aggregate.describe([xrn.get_urn()], version=rspec.version)
 
 
         return aggregate.describe([xrn.get_urn()], version=rspec.version)
 
-    def provision(self, urns, options={}):
+    def provision(self, urns, options=None):
+        if options is None: options={}
         # update users
         slices = IotlabSlices(self)
         aggregate = IotlabAggregate(self)
         # update users
         slices = IotlabSlices(self)
         aggregate = IotlabAggregate(self)
index e486624..966a26b 100644 (file)
@@ -356,7 +356,7 @@ class IotlabSlices:
         return sfa_slice
 
 
         return sfa_slice
 
 
-    def verify_persons(self, slice_hrn, slice_record, users, options={}):
+    def verify_persons(self, slice_hrn, slice_record, users, options=None):
         """Ensures the users in users list exist and are enabled in LDAP. Adds
         person if needed (AddPerson).
 
         """Ensures the users in users list exist and are enabled in LDAP. Adds
         person if needed (AddPerson).
 
@@ -382,7 +382,7 @@ class IotlabSlices:
 
 
         """
 
 
         """
-
+        if options is None: options={}
         logger.debug("IOTLABSLICES \tverify_persons \tslice_hrn  %s  \
                     \t slice_record %s\r\n users %s \t  "
                      % (slice_hrn, slice_record, users))
         logger.debug("IOTLABSLICES \tverify_persons \tslice_hrn  %s  \
                     \t slice_record %s\r\n users %s \t  "
                      % (slice_hrn, slice_record, users))
@@ -528,10 +528,11 @@ class IotlabSlices:
         return added_persons
 
 
         return added_persons
 
 
-    def verify_keys(self, persons, users, peer, options={}):
+    def verify_keys(self, persons, users, peer, options=None):
         """
         .. warning:: unused
         """
         """
         .. warning:: unused
         """
+        if options is None: options={}
         # existing keys
         key_ids = []
         for person in persons:
         # existing keys
         key_ids = []
         for person in persons:
index 1521103..8b73644 100644 (file)
@@ -29,7 +29,8 @@ class AggregateManager:
             'geni_ad_rspec_versions': ad_rspec_versions,
             }
 
             'geni_ad_rspec_versions': ad_rspec_versions,
             }
 
-    def get_rspec_version_string(self, rspec_version, options={}):
+    def get_rspec_version_string(self, rspec_version, options=None):
+        if options is None: options={}
         version_string = "rspec_%s" % (rspec_version)
 
         #panos adding the info option to the caching key (can be improved)
         version_string = "rspec_%s" % (rspec_version)
 
         #panos adding the info option to the caching key (can be improved)
@@ -149,12 +150,14 @@ class AggregateManager:
 
         return api.driver.renew(xrns, expiration_time, options)
 
 
         return api.driver.renew(xrns, expiration_time, options)
 
-    def PerformOperationalAction(self, api, xrns, creds, action, options={}):
+    def PerformOperationalAction(self, api, xrns, creds, action, options=None):
+        if options is None: options={}
         call_id = options.get('call_id')
         if Callids().already_handled(call_id): return True
         return api.driver.perform_operational_action(xrns, action, options) 
 
         call_id = options.get('call_id')
         if Callids().already_handled(call_id): return True
         return api.driver.perform_operational_action(xrns, action, options) 
 
-    def Shutdown(self, api, xrn, creds, options={}):
+    def Shutdown(self, api, xrn, creds, options=None):
+        if options is None: options={}
         call_id = options.get('call_id')
         if Callids().already_handled(call_id): return True
         return api.driver.shutdown(xrn, options) 
         call_id = options.get('call_id')
         if Callids().already_handled(call_id): return True
         return api.driver.shutdown(xrn, options) 
index 0e8b71d..1985e0e 100644 (file)
@@ -78,7 +78,8 @@ class Driver:
 
     # answer to ListResources
     # returns : advertisment rspec (xml string)
 
     # answer to ListResources
     # returns : advertisment rspec (xml string)
-    def list_resources (self, version=None, options={}):
+    def list_resources (self, version=None, options=None):
+        if options is None: options={}
         return "dummy Driver.list_resources needs to be redefined"
 
     # the answer to Describe on a slice or a set of the slivers in a slice
         return "dummy Driver.list_resources needs to be redefined"
 
     # the answer to Describe on a slice or a set of the slivers in a slice
@@ -97,40 +98,48 @@ class Driver:
     #              ...
     #                ]
     #}
     #              ...
     #                ]
     #}
-    def describe (self, urns, version, options={}):
+    def describe (self, urns, version, options=None):
+        if options is None: options={}
         return "dummy Driver.describe needs to be redefined"
 
     # the answer to Allocate on a given slicei or a set of the slivers in a slice
     # returns: same struct as for describe.
         return "dummy Driver.describe needs to be redefined"
 
     # the answer to Allocate on a given slicei or a set of the slivers in a slice
     # returns: same struct as for describe.
-    def allocate (self, urn, rspec_string, expiration, options={}):
+    def allocate (self, urn, rspec_string, expiration, options=None):
+        if options is None: options={}
         return "dummy Driver.allocate needs to be redefined"
 
     # the answer to Provision on a given slice or a set of the slivers in a slice
     # returns: same struct as for describe.
         return "dummy Driver.allocate needs to be redefined"
 
     # the answer to Provision on a given slice or a set of the slivers in a slice
     # returns: same struct as for describe.
-    def provision(self, urns, options={}):
+    def provision(self, urns, options=None):
+        if options is None: options={}
         return "dummy Driver.provision needs to be redefined"
 
     # the answer to PerformOperationalAction on a given slice or a set of the slivers in a slice
     # returns: struct containing "geni_slivers" list of the struct returned by describe.
         return "dummy Driver.provision needs to be redefined"
 
     # the answer to PerformOperationalAction on a given slice or a set of the slivers in a slice
     # returns: struct containing "geni_slivers" list of the struct returned by describe.
-    def perform_operational_action (self, urns, action, options={}):
+    def perform_operational_action (self, urns, action, options=None):
+        if options is None: options={}
         return "dummy Driver.perform_operational_action needs to be redefined"
 
     # the answer to Status on a given slice or a set of the slivers in a slice
     # returns: struct containing "geni_urn" and "geni_slivers" list of the struct returned by describe.
         return "dummy Driver.perform_operational_action needs to be redefined"
 
     # the answer to Status on a given slice or a set of the slivers in a slice
     # returns: struct containing "geni_urn" and "geni_slivers" list of the struct returned by describe.
-    def status (self, urns, options={}): 
+    def status (self, urns, options=None): 
+        if options is None: options={}
         return "dummy Driver.status needs to be redefined"
 
     # the answer to Renew on a given slice or a set of the slivers in a slice
     # returns: struct containing "geni_slivers" list of the struct returned by describe.
         return "dummy Driver.status needs to be redefined"
 
     # the answer to Renew on a given slice or a set of the slivers in a slice
     # returns: struct containing "geni_slivers" list of the struct returned by describe.
-    def renew (self, urns, expiration_time, options={}):
+    def renew (self, urns, expiration_time, options=None):
+        if options is None: options={}
         return "dummy Driver.renew needs to be redefined"
 
     # the answer to Delete on a given slice
     # returns: struct containing "geni_slivers" list of the struct returned by describe.
         return "dummy Driver.renew needs to be redefined"
 
     # the answer to Delete on a given slice
     # returns: struct containing "geni_slivers" list of the struct returned by describe.
-    def delete(self, urns, options={}):
+    def delete(self, urns, options=None):
+        if options is None: options={}
         return "dummy Driver.delete needs to be redefined"
 
     # the answer to Shutdown on a given slice
     # returns: boolean
         return "dummy Driver.delete needs to be redefined"
 
     # the answer to Shutdown on a given slice
     # returns: boolean
-    def shutdown (self, xrn, options={}):
+    def shutdown (self, xrn, options=None):
+        if options is None: options={}
         return False
         return False
index 7306380..5a49d47 100644 (file)
@@ -237,7 +237,8 @@ class RegistryManager:
     
         return records
     
     
         return records
     
-    def List (self, api, xrn, origin_hrn=None, options={}):
+    def List (self, api, xrn, origin_hrn=None, options=None):
+        if options is None: options={}
         dbsession=api.dbsession()
         # load all know registry names into a prefix tree and attempt to find
         # the longest matching prefix
         dbsession=api.dbsession()
         # load all know registry names into a prefix tree and attempt to find
         # the longest matching prefix
index 05b0f1e..2a99b6f 100644 (file)
@@ -508,7 +508,8 @@ class SliceManager:
         multiclient.get_results()    
         return 1
      
         multiclient.get_results()    
         return 1
      
-    def Shutdown(self, api, xrn, creds, options={}):
+    def Shutdown(self, api, xrn, creds, options=None):
+        if options is None: options={}
         xrn = Xrn(xrn)  
         # get the callers hrn
         valid_cred = api.auth.checkCredentials(creds, 'stopslice', xrn.hrn)[0]
         xrn = Xrn(xrn)  
         # get the callers hrn
         valid_cred = api.auth.checkCredentials(creds, 'stopslice', xrn.hrn)[0]
index cb682e4..f043992 100644 (file)
@@ -15,6 +15,7 @@ class GetVersion(Method):
     returns = Parameter(dict, "Version information")
 
     # API v2 specifies options is optional, so..
     returns = Parameter(dict, "Version information")
 
     # API v2 specifies options is optional, so..
-    def call(self, options={}):
+    def call(self, options=None):
+        if options is None: options={}
         self.api.logger.info("interface: %s\tmethod-name: %s" % (self.api.interface, self.name))
         return self.api.manager.GetVersion(self.api, options)
         self.api.logger.info("interface: %s\tmethod-name: %s" % (self.api.interface, self.name))
         return self.api.manager.GetVersion(self.api, options)
index d53a0a5..83d7a6e 100644 (file)
@@ -25,7 +25,8 @@ class List(Method):
     # xxx used to be [SfaRecord]
     returns = [Parameter(dict, "registry record")]
     
     # xxx used to be [SfaRecord]
     returns = [Parameter(dict, "registry record")]
     
-    def call(self, xrn, creds, options={}):
+    def call(self, xrn, creds, options=None):
+        if options is None: options={}
         hrn, type = urn_to_hrn(xrn)
         valid_creds = self.api.auth.checkCredentials(creds, 'list')
 
         hrn, type = urn_to_hrn(xrn)
         valid_creds = self.api.auth.checkCredentials(creds, 'list')
 
index f3a6e67..dc34f75 100644 (file)
@@ -30,7 +30,8 @@ class Resolve(Method):
     # xxx used to be [SfaRecord]
     returns = [Parameter(dict, "registry record")]
     
     # xxx used to be [SfaRecord]
     returns = [Parameter(dict, "registry record")]
     
-    def call(self, xrns, creds, options={}):
+    def call(self, xrns, creds, options=None):
+        if options is None: options={}
         # use details=False by default, only when explicitly specified do we want 
         # to mess with the testbed details
         if 'details' in options: details=options['details']
         # use details=False by default, only when explicitly specified do we want 
         # to mess with the testbed details
         if 'details' in options: details=options['details']
index bb7c56d..832a2c7 100644 (file)
@@ -68,7 +68,9 @@ class NitosAggregate:
        
 
 
        
 
 
-    def get_nodes(self, slice_xrn, slice=None,slivers={}, options={}):
+    def get_nodes(self, slice_xrn, slice=None,slivers=None, options=None):
+        if slivers is None: slivers={}
+        if options is None: options={}
         # if we are dealing with a slice that has no node just return 
         # and empty list    
         if slice_xrn:
         # if we are dealing with a slice that has no node just return 
         # and empty list    
         if slice_xrn:
@@ -126,8 +128,9 @@ class NitosAggregate:
             rspec_nodes.append(rspec_node)
         return rspec_nodes 
 
             rspec_nodes.append(rspec_node)
         return rspec_nodes 
 
-    def get_leases_and_channels(self, slice=None, slice_xrn=None,  options={}):
-        
+    def get_leases_and_channels(self, slice=None, slice_xrn=None,  options=None):
+
+        if options is None: options={}
         slices = self.driver.shell.getSlices({}, [])
         nodes = self.driver.shell.getNodes({}, [])
         leases = self.driver.shell.getReservedNodes({}, [])
         slices = self.driver.shell.getSlices({}, [])
         nodes = self.driver.shell.getNodes({}, [])
         leases = self.driver.shell.getReservedNodes({}, [])
@@ -216,8 +219,9 @@ class NitosAggregate:
         return (rspec_leases, rspec_channels)
 
 
         return (rspec_leases, rspec_channels)
 
 
-    def get_channels(self, slice=None, options={}):
+    def get_channels(self, slice=None, options=None):
+        if options is None: options={}
+
         all_channels = self.driver.shell.getChannels({}, [])
         channels = []
         if slice:
         all_channels = self.driver.shell.getChannels({}, [])
         channels = []
         if slice:
@@ -245,7 +249,8 @@ class NitosAggregate:
 
 
     
 
 
     
-    def get_rspec(self, slice_xrn=None, version = None, options={}):
+    def get_rspec(self, slice_xrn=None, version = None, options=None):
+        if options is None: options={}
 
         version_manager = VersionManager()
         version = version_manager.get_version(version)
 
         version_manager = VersionManager()
         version = version_manager.get_version(version)
index 3eac8aa..875a5a9 100644 (file)
@@ -153,7 +153,8 @@ class NitosSlices:
 
                         
         
 
                         
         
-    def verify_slice(self, slice_hrn, slice_record, sfa_peer, options={}):
+    def verify_slice(self, slice_hrn, slice_record, sfa_peer, options=None):
+        if options is None: options={}
         slicename = hrn_to_nitos_slicename(slice_hrn)
         slices = self.driver.shell.getSlices({}, []) 
         slices = self.driver.filter_nitos_results(slices, {'slice_name': slicename})
         slicename = hrn_to_nitos_slicename(slice_hrn)
         slices = self.driver.shell.getSlices({}, []) 
         slices = self.driver.filter_nitos_results(slices, {'slice_name': slicename})
@@ -168,7 +169,8 @@ class NitosSlices:
        
         return slice
 
        
         return slice
 
-    def verify_users(self, slice_hrn, slice_record, users, sfa_peer, options={}):
+    def verify_users(self, slice_hrn, slice_record, users, sfa_peer, options=None):
+        if options is None: options={}
         # get slice info
         slicename = hrn_to_nitos_slicename(slice_hrn)
         slices = self.driver.shell.getSlices({}, [])
         # get slice info
         slicename = hrn_to_nitos_slicename(slice_hrn)
         slices = self.driver.shell.getSlices({}, [])
@@ -204,7 +206,8 @@ class NitosSlices:
         return added_users
 
 
         return added_users
 
 
-    def verify_keys(self, persons, users, options={}):
+    def verify_keys(self, persons, users, options=None):
+        if options is None: options={}
         # existing keys 
         key_ids = []
         for person in persons:
         # existing keys 
         key_ids = []
         for person in persons:
index 54aaf50..555b1b9 100644 (file)
@@ -4,7 +4,8 @@ from sfa.rspecs.elements.disk_image import DiskImage
 
 class Image:
     
 
 class Image:
     
-    def __init__(self, image={}):
+    def __init__(self, image=None):
+        if image is None: image={}
         self.id = None
         self.container_format = None
         self.kernel_id = None
         self.id = None
         self.container_format = None
         self.kernel_id = None
index e36946e..39ea2f9 100644 (file)
@@ -355,23 +355,27 @@ class NovaDriver(Driver):
         return {}
 
     # first 2 args are None in case of resource discovery
         return {}
 
     # first 2 args are None in case of resource discovery
-    def list_resources (self, version=None, options={}):
+    def list_resources (self, version=None, options=None):
+        if options is None: options={}
         aggregate = OSAggregate(self)
         rspec =  aggregate.list_resources(version=version, options=options)
         return rspec
 
         aggregate = OSAggregate(self)
         rspec =  aggregate.list_resources(version=version, options=options)
         return rspec
 
-    def describe(self, urns, version=None, options={}):
+    def describe(self, urns, version=None, options=None):
+        if options is None: options={}
         aggregate = OSAggregate(self)
         return aggregate.describe(urns, version=version, options=options)
     
         aggregate = OSAggregate(self)
         return aggregate.describe(urns, version=version, options=options)
     
-    def status (self, urns, options={}):
+    def status (self, urns, options=None):
+        if options is None: options={}
         aggregate = OSAggregate(self)
         desc =  aggregate.describe(urns)
         status = {'geni_urn': desc['geni_urn'],
                   'geni_slivers': desc['geni_slivers']}
         return status
 
         aggregate = OSAggregate(self)
         desc =  aggregate.describe(urns)
         status = {'geni_urn': desc['geni_urn'],
                   'geni_slivers': desc['geni_slivers']}
         return status
 
-    def allocate (self, urn, rspec_string, expiration, options={}):
+    def allocate (self, urn, rspec_string, expiration, options=None):
+        if options is None: options={}
         xrn = Xrn(urn) 
         aggregate = OSAggregate(self)
 
         xrn = Xrn(urn) 
         aggregate = OSAggregate(self)
 
@@ -401,7 +405,8 @@ class NovaDriver(Driver):
    
         return aggregate.describe(urns=[urn], version=rspec.version)
 
    
         return aggregate.describe(urns=[urn], version=rspec.version)
 
-    def provision(self, urns, options={}):
+    def provision(self, urns, options=None):
+        if options is None: options={}
         # update sliver allocation states and set them to geni_provisioned
         aggregate = OSAggregate(self)
         instances = aggregate.get_instances(urns)
         # update sliver allocation states and set them to geni_provisioned
         aggregate = OSAggregate(self)
         instances = aggregate.get_instances(urns)
@@ -415,7 +420,8 @@ class NovaDriver(Driver):
         rspec_version = version_manager.get_version(options['geni_rspec_version'])
         return self.describe(urns, rspec_version, options=options) 
 
         rspec_version = version_manager.get_version(options['geni_rspec_version'])
         return self.describe(urns, rspec_version, options=options) 
 
-    def delete (self, urns, options={}):
+    def delete (self, urns, options=None):
+        if options is None: options={}
         # collect sliver ids so we can update sliver allocation states after
         # we remove the slivers.
         aggregate = OSAggregate(self)
         # collect sliver ids so we can update sliver allocation states after
         # we remove the slivers.
         aggregate = OSAggregate(self)
@@ -441,11 +447,13 @@ class NovaDriver(Driver):
                  'geni_expires': None})        
         return geni_slivers
 
                  'geni_expires': None})        
         return geni_slivers
 
-    def renew (self, urns, expiration_time, options={}):
+    def renew (self, urns, expiration_time, options=None):
+        if options is None: options={}
         description = self.describe(urns, None, options)
         return description['geni_slivers']
 
         description = self.describe(urns, None, options)
         return description['geni_slivers']
 
-    def perform_operational_action  (self, urns, action, options={}):
+    def perform_operational_action  (self, urns, action, options=None):
+        if options is None: options={}
         aggregate = OSAggregate(self)
         action = action.lower() 
         if action == 'geni_start':
         aggregate = OSAggregate(self)
         action = action.lower() 
         if action == 'geni_start':
@@ -474,7 +482,8 @@ class NovaDriver(Driver):
         geni_slivers = self.describe(urns, None, options)['geni_slivers']
         return geni_slivers
 
         geni_slivers = self.describe(urns, None, options)['geni_slivers']
         return geni_slivers
 
-    def shutdown(self, xrn, options={}):
+    def shutdown(self, xrn, options=None):
+        if options is None: options={}
         xrn = OSXrn(xrn=xrn, type='slice')
         tenant_name = xrn.get_tenant_name()
         name = xrn.get_slicename()
         xrn = OSXrn(xrn=xrn, type='slice')
         tenant_name = xrn.get_tenant_name()
         name = xrn.get_slicename()
index f31891b..2b65399 100644 (file)
@@ -58,7 +58,8 @@ class OSAggregate:
             zones = [zone.name for zone in zones]
         return zones
 
             zones = [zone.name for zone in zones]
         return zones
 
-    def list_resources(self, version=None, options={}):
+    def list_resources(self, version=None, options=None):
+        if options is None: options={}
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(version.type, version.version, 'ad')
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(version.type, version.version, 'ad')
@@ -67,7 +68,8 @@ class OSAggregate:
         rspec.version.add_nodes(nodes)
         return rspec.toxml()
 
         rspec.version.add_nodes(nodes)
         return rspec.toxml()
 
-    def describe(self, urns, version=None, options={}):
+    def describe(self, urns, version=None, options=None):
+        if options is None: options={}
         # update nova connection
         tenant_name = OSXrn(xrn=urns[0], type='slice').get_tenant_name()
         self.driver.shell.nova_manager.connect(tenant=tenant_name)
         # update nova connection
         tenant_name = OSXrn(xrn=urns[0], type='slice').get_tenant_name()
         self.driver.shell.nova_manager.connect(tenant=tenant_name)
@@ -211,7 +213,8 @@ class OSAggregate:
                          'storage':  str(instance.disk)})
         return sliver   
 
                          'storage':  str(instance.disk)})
         return sliver   
 
-    def instance_to_geni_sliver(self, instance, sliver_allocations = {}):
+    def instance_to_geni_sliver(self, instance, sliver_allocations=None):
+        if sliver_allocations is None: sliver_allocations={}
         sliver_hrn = '%s.%s' % (self.driver.hrn, instance.id)
         sliver_id = Xrn(sliver_hrn, type='sliver').urn
  
         sliver_hrn = '%s.%s' % (self.driver.hrn, instance.id)
         sliver_id = Xrn(sliver_hrn, type='sliver').urn
  
@@ -302,7 +305,8 @@ class OSAggregate:
         return key_name       
         
 
         return key_name       
         
 
-    def create_security_group(self, slicename, fw_rules=[]):
+    def create_security_group(self, slicename, fw_rules=None):
+        if fw_rules is None: fw_rules=[]
         # use default group by default
         group_name = 'default' 
         if isinstance(fw_rules, list) and fw_rules:
         # use default group by default
         group_name = 'default' 
         if isinstance(fw_rules, list) and fw_rules:
index cae6495..2876694 100644 (file)
@@ -31,7 +31,8 @@ class PlAggregate:
     def __init__(self, driver):
         self.driver = driver
 
     def __init__(self, driver):
         self.driver = driver
 
-    def get_nodes(self, options={}):
+    def get_nodes(self, options=None):
+        if options is None: options={}
         filter = {'peer_id': None}
         geni_available = options.get('geni_available')    
         if geni_available == True:
         filter = {'peer_id': None}
         geni_available = options.get('geni_available')    
         if geni_available == True:
@@ -40,13 +41,15 @@ class PlAggregate:
        
         return nodes  
  
        
         return nodes  
  
-    def get_sites(self, filter={}):
+    def get_sites(self, filter=None):
+        if filter is None: filter={}
         sites = {}
         for site in self.driver.shell.GetSites(filter):
             sites[site['site_id']] = site
         return sites
 
         sites = {}
         for site in self.driver.shell.GetSites(filter):
             sites[site['site_id']] = site
         return sites
 
-    def get_interfaces(self, filter={}):
+    def get_interfaces(self, filter=None):
+        if filter is None: filter={}
         interfaces = {}
         for interface in self.driver.shell.GetInterfaces(filter):
             iface = Interface()
         interfaces = {}
         for interface in self.driver.shell.GetInterfaces(filter):
             iface = Interface()
@@ -98,20 +101,23 @@ class PlAggregate:
 
         return links
 
 
         return links
 
-    def get_node_tags(self, filter={}):
+    def get_node_tags(self, filter=None):
+        if filter is None: filter={}
         node_tags = {}
         for node_tag in self.driver.shell.GetNodeTags(filter):
             node_tags[node_tag['node_tag_id']] = node_tag
         return node_tags
 
         node_tags = {}
         for node_tag in self.driver.shell.GetNodeTags(filter):
             node_tags[node_tag['node_tag_id']] = node_tag
         return node_tags
 
-    def get_pl_initscripts(self, filter={}):
+    def get_pl_initscripts(self, filter=None):
+        if filter is None: filter={}
         pl_initscripts = {}
         filter.update({'enabled': True})
         for initscript in self.driver.shell.GetInitScripts(filter):
             pl_initscripts[initscript['initscript_id']] = initscript
         return pl_initscripts
 
         pl_initscripts = {}
         filter.update({'enabled': True})
         for initscript in self.driver.shell.GetInitScripts(filter):
             pl_initscripts[initscript['initscript_id']] = initscript
         return pl_initscripts
 
-    def get_slivers(self, urns, options={}):
+    def get_slivers(self, urns, options=None):
+        if options is None: options={}
         names = set()
         slice_ids = set()
         node_ids = []
         names = set()
         slice_ids = set()
         node_ids = []
@@ -193,7 +199,9 @@ class PlAggregate:
             slivers.append(node)
         return slivers
 
             slivers.append(node)
         return slivers
 
-    def node_to_rspec_node(self, node, sites, interfaces, node_tags, pl_initscripts=[], grain=None, options={}):
+    def node_to_rspec_node(self, node, sites, interfaces, node_tags, pl_initscripts=None, grain=None, options=None):
+        if pl_initscripts is None: pl_initscripts=[]
+        if options is None: options={}
         rspec_node = NodeElement()
         # xxx how to retrieve site['login_base']
         site=sites[node['site_id']]
         rspec_node = NodeElement()
         # xxx how to retrieve site['login_base']
         site=sites[node['site_id']]
@@ -286,7 +294,8 @@ class PlAggregate:
             tags_dict[tag['node_id']] = tag
         return tags_dict
 
             tags_dict[tag['node_id']] = tag
         return tags_dict
 
-    def get_slice_nodes(self, slice, options={}):
+    def get_slice_nodes(self, slice, options=None):
+        if options is None: options={}
         nodes_dict = {}
         filter = {'peer_id': None}
         tags_filter = {}
         nodes_dict = {}
         filter = {'peer_id': None}
         tags_filter = {}
@@ -304,7 +313,8 @@ class PlAggregate:
             nodes_dict[node['node_id']] = node
         return nodes_dict
 
             nodes_dict[node['node_id']] = node
         return nodes_dict
 
-    def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations = {}):
+    def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations=None):
+        if sliver_allocations is None: sliver_allocations={}
         if rspec_node['sliver_id'] in sliver_allocations:
             # set sliver allocation and operational status
             sliver_allocation = sliver_allocations[rspec_node['sliver_id']]
         if rspec_node['sliver_id'] in sliver_allocations:
             # set sliver allocation and operational status
             sliver_allocation = sliver_allocations[rspec_node['sliver_id']]
@@ -333,7 +343,8 @@ class PlAggregate:
                        }
         return geni_sliver        
 
                        }
         return geni_sliver        
 
-    def get_leases(self, slice=None, options={}):
+    def get_leases(self, slice=None, options=None):
+        if options is None: options={}
         
         now = int(time.time())
         filter={}
         
         now = int(time.time())
         filter={}
@@ -370,7 +381,8 @@ class PlAggregate:
         return rspec_leases
 
     
         return rspec_leases
 
     
-    def list_resources(self, version = None, options={}):
+    def list_resources(self, version = None, options=None):
+        if options is None: options={}
 
         version_manager = VersionManager()
         version = version_manager.get_version(version)
 
         version_manager = VersionManager()
         version = version_manager.get_version(version)
@@ -410,7 +422,8 @@ class PlAggregate:
 
         return rspec.toxml()
 
 
         return rspec.toxml()
 
-    def describe(self, urns, version=None, options={}):
+    def describe(self, urns, version=None, options=None):
+        if options is None: options={}
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
index 1c59fc9..53f1256 100644 (file)
@@ -627,23 +627,27 @@ class PlDriver (Driver):
         return {}
 
     # first 2 args are None in case of resource discovery
         return {}
 
     # first 2 args are None in case of resource discovery
-    def list_resources (self, version=None, options={}):
+    def list_resources (self, version=None, options=None):
+        if options is None: options={}
         aggregate = PlAggregate(self)
         rspec =  aggregate.list_resources(version=version, options=options)
         return rspec
 
         aggregate = PlAggregate(self)
         rspec =  aggregate.list_resources(version=version, options=options)
         return rspec
 
-    def describe(self, urns, version, options={}):
+    def describe(self, urns, version, options=None):
+        if options is None: options={}
         aggregate = PlAggregate(self)
         return aggregate.describe(urns, version=version, options=options)
     
         aggregate = PlAggregate(self)
         return aggregate.describe(urns, version=version, options=options)
     
-    def status (self, urns, options={}):
+    def status (self, urns, options=None):
+        if options is None: options={}
         aggregate = PlAggregate(self)
         desc =  aggregate.describe(urns, version='GENI 3')
         status = {'geni_urn': desc['geni_urn'],
                   'geni_slivers': desc['geni_slivers']}
         return status
 
         aggregate = PlAggregate(self)
         desc =  aggregate.describe(urns, version='GENI 3')
         status = {'geni_urn': desc['geni_urn'],
                   'geni_slivers': desc['geni_slivers']}
         return status
 
-    def allocate (self, urn, rspec_string, expiration, options={}):
+    def allocate (self, urn, rspec_string, expiration, options=None):
+        if options is None: options={}
         xrn = Xrn(urn)
         aggregate = PlAggregate(self)
         slices = PlSlices(self)
         xrn = Xrn(urn)
         aggregate = PlAggregate(self)
         slices = PlSlices(self)
@@ -680,7 +684,8 @@ class PlDriver (Driver):
 
         return aggregate.describe([xrn.get_urn()], version=rspec.version)
 
 
         return aggregate.describe([xrn.get_urn()], version=rspec.version)
 
-    def provision(self, urns, options={}):
+    def provision(self, urns, options=None):
+        if options is None: options={}
         # update users
         slices = PlSlices(self)
         aggregate = PlAggregate(self)
         # update users
         slices = PlSlices(self)
         aggregate = PlAggregate(self)
@@ -715,7 +720,8 @@ class PlDriver (Driver):
         rspec_version = version_manager.get_version(options['geni_rspec_version']) 
         return self.describe(urns, rspec_version, options=options)
 
         rspec_version = version_manager.get_version(options['geni_rspec_version']) 
         return self.describe(urns, rspec_version, options=options)
 
-    def delete(self, urns, options={}):
+    def delete(self, urns, options=None):
+        if options is None: options={}
         # collect sliver ids so we can update sliver allocation states after
         # we remove the slivers.
         aggregate = PlAggregate(self)
         # collect sliver ids so we can update sliver allocation states after
         # we remove the slivers.
         aggregate = PlAggregate(self)
@@ -754,7 +760,8 @@ class PlDriver (Driver):
                  'geni_expires': datetime_to_string(utcparse(sliver['expires']))})  
         return geni_slivers
 
                  'geni_expires': datetime_to_string(utcparse(sliver['expires']))})  
         return geni_slivers
 
-    def renew (self, urns, expiration_time, options={}):
+    def renew (self, urns, expiration_time, options=None):
+        if options is None: options={}
         aggregate = PlAggregate(self)
         slivers = aggregate.get_slivers(urns)
         if not slivers:
         aggregate = PlAggregate(self)
         slivers = aggregate.get_slivers(urns)
         if not slivers:
@@ -767,7 +774,8 @@ class PlDriver (Driver):
         return description['geni_slivers']
             
 
         return description['geni_slivers']
             
 
-    def perform_operational_action (self, urns, action, options={}):
+    def perform_operational_action (self, urns, action, options=None):
+        if options is None: options={}
         # MyPLC doesn't support operational actions. Lets pretend like it
         # supports start, but reject everything else.
         action = action.lower()
         # MyPLC doesn't support operational actions. Lets pretend like it
         # supports start, but reject everything else.
         action = action.lower()
@@ -787,7 +795,8 @@ class PlDriver (Driver):
         return geni_slivers
 
     # set the 'enabled' tag to 0
         return geni_slivers
 
     # set the 'enabled' tag to 0
-    def shutdown (self, xrn, options={}):
+    def shutdown (self, xrn, options=None):
+        if options is None: options={}
         hrn, _ = urn_to_hrn(xrn)
         top_auth_hrn = top_auth(hrn)
         site_hrn = '.'.join(hrn.split('.')[:-1])
         hrn, _ = urn_to_hrn(xrn)
         top_auth_hrn = top_auth(hrn)
         site_hrn = '.'.join(hrn.split('.')[:-1])
index b6cec88..1226f12 100644 (file)
@@ -322,7 +322,9 @@ class PlSlices:
                         
         
 
                         
         
 
-    def verify_site(self, slice_xrn, slice_record={}, sfa_peer=None, options={}):
+    def verify_site(self, slice_xrn, slice_record=None, sfa_peer=None, options=None):
+        if slice_record is None: slice_record={}
+        if options is None: options={}
         (slice_hrn, type) = urn_to_hrn(slice_xrn)
         top_auth_hrn = top_auth(slice_hrn)
         site_hrn = '.'.join(slice_hrn.split('.')[:-1])
         (slice_hrn, type) = urn_to_hrn(slice_xrn)
         top_auth_hrn = top_auth(slice_hrn)
         site_hrn = '.'.join(slice_hrn.split('.')[:-1])
@@ -367,7 +369,8 @@ class PlSlices:
         return site
 
 
         return site
 
 
-    def verify_slice(self, slice_hrn, slice_record, sfa_peer, expiration, options={}):
+    def verify_slice(self, slice_hrn, slice_record, sfa_peer, expiration, options=None):
+        if options is None: options={}
         top_auth_hrn = top_auth(slice_hrn)
         site_hrn = '.'.join(slice_hrn.split('.')[:-1])
         slice_part = slice_hrn.split('.')[-1]
         top_auth_hrn = top_auth(slice_hrn)
         site_hrn = '.'.join(slice_hrn.split('.')[:-1])
         slice_part = slice_hrn.split('.')[-1]
@@ -416,7 +419,8 @@ class PlSlices:
         return self.driver.shell.GetSlices(int(slice['slice_id']))[0]
 
 
         return self.driver.shell.GetSlices(int(slice['slice_id']))[0]
 
 
-    def verify_persons(self, slice_hrn, slice_record, users, sfa_peer, options={}):
+    def verify_persons(self, slice_hrn, slice_record, users, sfa_peer, options=None):
+        if options is None: options={}
         top_auth_hrn = top_auth(slice_hrn)
         site_hrn = '.'.join(slice_hrn.split('.')[:-1])
         slice_part = slice_hrn.split('.')[-1]
         top_auth_hrn = top_auth(slice_hrn)
         site_hrn = '.'.join(slice_hrn.split('.')[:-1])
         slice_part = slice_hrn.split('.')[-1]
@@ -504,7 +508,8 @@ class PlSlices:
         return persons_to_add
 
 
         return persons_to_add
 
 
-    def verify_keys(self, persons_to_verify_keys, options={}):
+    def verify_keys(self, persons_to_verify_keys, options=None):
+        if options is None: options={}
         # we only add keys that comes from sfa to persons in PL
         for person_id in persons_to_verify_keys:
              person_sfa_keys = persons_to_verify_keys[person_id].get('keys', [])
         # we only add keys that comes from sfa to persons in PL
         for person_id in persons_to_verify_keys:
              person_sfa_keys = persons_to_verify_keys[person_id].get('keys', [])
@@ -518,7 +523,8 @@ class PlSlices:
                   self.driver.shell.AddPersonKey(int(person_id), key)
 
 
                   self.driver.shell.AddPersonKey(int(person_id), key)
 
 
-    def verify_slice_attributes(self, slice, requested_slice_attributes, options={}, admin=False):
+    def verify_slice_attributes(self, slice, requested_slice_attributes, options=None, admin=False):
+        if options is None: options={}
         append = options.get('append', True)
         # get list of attributes users ar able to manage
         filter = {'category': '*slice*'}
         append = options.get('append', True)
         # get list of attributes users ar able to manage
         filter = {'category': '*slice*'}
index 7f79e81..36ad12f 100644 (file)
@@ -2,7 +2,8 @@ class Element(dict):
 
     fields = {}
 
 
     fields = {}
 
-    def __init__(self, fields={}, element=None, keys=None):
+    def __init__(self, fields=None, element=None, keys=None):
+        if fields is None: fields={}
         self.element = element
         dict.__init__(self, dict.fromkeys(self.fields))
         if not keys:
         self.element = element
         dict.__init__(self, dict.fromkeys(self.fields))
         if not keys:
index eebb1ae..bfc503a 100644 (file)
@@ -29,7 +29,8 @@ class Iotlabv1Lease:
 
 
     @staticmethod
 
 
     @staticmethod
-    def get_leases(xml, filter={}):
+    def get_leases(xml, filter=None):
+        if filter is None: filter={}
         xpath = '//lease%s | //default:lease%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         lease_elems = xml.xpath(xpath)
         return Iotlabv1Lease.get_lease_objs(lease_elems)
         xpath = '//lease%s | //default:lease%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         lease_elems = xml.xpath(xpath)
         return Iotlabv1Lease.get_lease_objs(lease_elems)
index af6fe2a..49f7cfd 100644 (file)
@@ -160,14 +160,16 @@ class Iotlabv1Node:
         return node_elems
 
     @staticmethod
         return node_elems
 
     @staticmethod
-    def get_nodes(xml, filter={}):
+    def get_nodes(xml, filter=None):
+        if filter is None: filter={}
         xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), \
                                                     XpathFilter.xpath(filter))
         node_elems = xml.xpath(xpath)
         return Iotlabv1Node.get_node_objs(node_elems)
 
     @staticmethod
         xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), \
                                                     XpathFilter.xpath(filter))
         node_elems = xml.xpath(xpath)
         return Iotlabv1Node.get_node_objs(node_elems)
 
     @staticmethod
-    def get_nodes_with_slivers(xml, sliver_filter={}):
+    def get_nodes_with_slivers(xml, sliver_filter=None):
+        if sliver_filter is None: sliver_filter={}
 
         xpath = '//node[count(sliver)>0] | \
                                 //default:node[count(default:sliver) > 0]'
 
         xpath = '//node[count(sliver)>0] | \
                                 //default:node[count(default:sliver) > 0]'
index f26ace6..0f9fb01 100644 (file)
@@ -35,7 +35,8 @@ class Iotlabv1Sliver:
                     for (key, value) in attrib_dict.items():
                         attrib_elem.set(key, value)
     @staticmethod
                     for (key, value) in attrib_dict.items():
                         attrib_elem.set(key, value)
     @staticmethod
-    def get_slivers(xml, filter={}):
+    def get_slivers(xml, filter=None):
+        if filter is None: filter={}
         xpath = './default:sliver | ./sliver'
 
         sliver_elems = xml.xpath(xpath)
         xpath = './default:sliver | ./sliver'
 
         sliver_elems = xml.xpath(xpath)
@@ -54,5 +55,6 @@ class Iotlabv1Sliver:
         return slivers
 
     @staticmethod
         return slivers
 
     @staticmethod
-    def get_sliver_attributes(xml, filter={}):
-        return []
\ No newline at end of file
+    def get_sliver_attributes(xml, filter=None):
+        if filter is None: filter={}
+        return []
index 60582e3..cf4a5f6 100644 (file)
@@ -54,7 +54,8 @@ class NITOSv1Channel:
 
 
     @staticmethod
 
 
     @staticmethod
-    def get_channels(xml, filter={}):
+    def get_channels(xml, filter=None):
+        if filter is None: filter={}
         xpath = '//channel%s | //default:channel%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         channel_elems = xml.xpath(xpath)
         return NITOSv1Channel.get_channel_objs(channel_elems)
         xpath = '//channel%s | //default:channel%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         channel_elems = xml.xpath(xpath)
         return NITOSv1Channel.get_channel_objs(channel_elems)
index 99e815a..dd3041c 100644 (file)
@@ -73,7 +73,8 @@ class NITOSv1Lease:
             
 
     @staticmethod
             
 
     @staticmethod
-    def get_leases(xml, filter={}):
+    def get_leases(xml, filter=None):
+        if filter is None: filter={}
         xpath = '//lease%s | //default:lease%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         lease_elems = xml.xpath(xpath)
         return NITOSv1Lease.get_lease_objs(lease_elems)
         xpath = '//lease%s | //default:lease%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         lease_elems = xml.xpath(xpath)
         return NITOSv1Lease.get_lease_objs(lease_elems)
index 44b9b52..ea59b3d 100644 (file)
@@ -135,7 +135,8 @@ class NITOSv1Node:
                     node.element.remove(sliver.element)
         
     @staticmethod
                     node.element.remove(sliver.element)
         
     @staticmethod
-    def get_nodes(xml, filter={}):
+    def get_nodes(xml, filter=None):
+        if filter is None: filter={}
         xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         node_elems = xml.xpath(xpath)
         return NITOSv1Node.get_node_objs(node_elems)
         xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         node_elems = xml.xpath(xpath)
         return NITOSv1Node.get_node_objs(node_elems)
index 7d03fe0..ea34ff4 100644 (file)
@@ -9,7 +9,8 @@ class NITOSv1PLTag:
             pl_tag_elem.set_text(value)
               
     @staticmethod
             pl_tag_elem.set_text(value)
               
     @staticmethod
-    def get_pl_tags(xml, ignore=[]):
+    def get_pl_tags(xml, ignore=None):
+        if ignore is None: ignore=[]
         pl_tags = []
         for elem in xml.iterchildren():
             if elem.tag not in ignore:
         pl_tags = []
         for elem in xml.iterchildren():
             if elem.tag not in ignore:
index 0f40211..feac887 100644 (file)
@@ -43,7 +43,8 @@ class NITOSv1Sliver:
         return attribs 
                 
     @staticmethod
         return attribs 
                 
     @staticmethod
-    def get_slivers(xml, filter={}):
+    def get_slivers(xml, filter=None):
+        if filter is None: filter={}
         xpath = './default:sliver | ./sliver'
         sliver_elems = xml.xpath(xpath)
         slivers = []
         xpath = './default:sliver | ./sliver'
         sliver_elems = xml.xpath(xpath)
         slivers = []
index 07520ef..f4cf74d 100644 (file)
@@ -39,7 +39,8 @@ class Ofeliav1Port:
         return attribs 
                 
     @staticmethod
         return attribs 
                 
     @staticmethod
-    def get_ports(xml, filter={}):
+    def get_ports(xml, filter=None):
+        if filter is None: filter={}
         xpath = './openflow:port | ./port'
         port_elems = xml.xpath(xpath)
         ports = []
         xpath = './openflow:port | ./port'
         port_elems = xml.xpath(xpath)
         ports = []
index 86a3800..a184973 100644 (file)
@@ -21,7 +21,8 @@ from sfa.rspecs.elements.versions.ofeliav1Port import Ofeliav1Port
 class Ofeliav1Datapath:
 
     @staticmethod
 class Ofeliav1Datapath:
 
     @staticmethod
-    def get_datapaths(xml, filter={}):
+    def get_datapaths(xml, filter=None):
+        if filter is None: filter={}
         #xpath = '//datapath%s | //default:datapath%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         xpath = '//datapath%s | //openflow:datapath%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         datapath_elems = xml.xpath(xpath)
         #xpath = '//datapath%s | //default:datapath%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         xpath = '//datapath%s | //openflow:datapath%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         datapath_elems = xml.xpath(xpath)
@@ -144,7 +145,8 @@ class Ofeliav1Datapath:
 #                    node.element.remove(sliver.element)
 #        
 #    @staticmethod
 #                    node.element.remove(sliver.element)
 #        
 #    @staticmethod
-#    def get_nodes(xml, filter={}):
+#    def get_nodes(xml, filter=None):
+#        if filter is None: filter={}
 #        xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
 #        node_elems = xml.xpath(xpath)
 #        return SFAv1Node.get_node_objs(node_elems)
 #        xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
 #        node_elems = xml.xpath(xpath)
 #        return SFAv1Node.get_node_objs(node_elems)
index 3fc2eb2..83a2096 100644 (file)
@@ -8,7 +8,8 @@ from sfa.rspecs.elements.link import Link
 class Ofeliav1Link:
 
     @staticmethod
 class Ofeliav1Link:
 
     @staticmethod
-    def get_links(xml, filter={}):
+    def get_links(xml, filter=None):
+        if filter is None: filter={}
         xpath = '//link%s | //openflow:link%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         link_elems = xml.xpath(xpath)
         return Ofeliav1Link.get_link_objs(link_elems)
         xpath = '//link%s | //openflow:link%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         link_elems = xml.xpath(xpath)
         return Ofeliav1Link.get_link_objs(link_elems)
index 51363de..4a6df82 100644 (file)
@@ -13,7 +13,8 @@ class PGv2DiskImage:
             xml.add_instance('disk_image', image, DiskImage.fields)
     
     @staticmethod
             xml.add_instance('disk_image', image, DiskImage.fields)
     
     @staticmethod
-    def get_images(xml, filter={}):
+    def get_images(xml, filter=None):
+        if filter is None: filter={}
         xpath = './default:disk_image | ./disk_image'
         image_elems = xml.xpath(xpath)
         images = []
         xpath = './default:disk_image | ./disk_image'
         image_elems = xml.xpath(xpath)
         images = []
index 68c44f0..b04f7dc 100644 (file)
@@ -51,7 +51,8 @@ class PGv2Lease:
 
 
     @staticmethod
 
 
     @staticmethod
-    def get_leases(xml, filter={}):
+    def get_leases(xml, filter=None):
+        if filter is None: filter={}
         xpath = '//lease%s | //default:lease%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         lease_elems = xml.xpath(xpath)
         return PGv2Lease.get_lease_objs(lease_elems)
         xpath = '//lease%s | //default:lease%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         lease_elems = xml.xpath(xpath)
         return PGv2Lease.get_lease_objs(lease_elems)
index d553d21..60447b0 100644 (file)
@@ -82,13 +82,15 @@ class PGv2Node:
 
 
     @staticmethod
 
 
     @staticmethod
-    def get_nodes(xml, filter={}):
+    def get_nodes(xml, filter=None):
+        if filter is None: filter={}
         xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         node_elems = xml.xpath(xpath)
         return PGv2Node.get_node_objs(node_elems)
 
     @staticmethod
         xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         node_elems = xml.xpath(xpath)
         return PGv2Node.get_node_objs(node_elems)
 
     @staticmethod
-    def get_nodes_with_slivers(xml, filter={}):
+    def get_nodes_with_slivers(xml, filter=None):
+        if filter is None: filter={}
         xpath = '//node[count(sliver_type)>0] | //default:node[count(default:sliver_type) > 0]' 
         node_elems = xml.xpath(xpath)        
         return PGv2Node.get_node_objs(node_elems)
         xpath = '//node[count(sliver_type)>0] | //default:node[count(default:sliver_type) > 0]' 
         node_elems = xml.xpath(xpath)        
         return PGv2Node.get_node_objs(node_elems)
index 1f3ec0c..3ad687f 100644 (file)
@@ -40,7 +40,8 @@ class PGv2SliverType:
                     for (key, value) in attrib_dict.items():
                         attrib_elem.set(key, value)                
     @staticmethod
                     for (key, value) in attrib_dict.items():
                         attrib_elem.set(key, value)                
     @staticmethod
-    def get_slivers(xml, filter={}):
+    def get_slivers(xml, filter=None):
+        if filter is None: filter={}
         xpath = './default:sliver_type | ./sliver_type'
         sliver_elems = xml.xpath(xpath)
         slivers = []
         xpath = './default:sliver_type | ./sliver_type'
         sliver_elems = xml.xpath(xpath)
         slivers = []
@@ -56,5 +57,6 @@ class PGv2SliverType:
         return slivers
 
     @staticmethod
         return slivers
 
     @staticmethod
-    def get_sliver_attributes(xml, filter={}):
+    def get_sliver_attributes(xml, filter=None):
+        if filter is None: filter={}
         return []             
         return []             
index 039d2d1..0c7cb26 100644 (file)
@@ -72,7 +72,8 @@ class SFAv1Lease:
 
 
     @staticmethod
 
 
     @staticmethod
-    def get_leases(xml, filter={}):
+    def get_leases(xml, filter=None):
+        if filter is None: filter={}
         xpath = '//lease%s | //default:lease%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         lease_elems = xml.xpath(xpath)
         return SFAv1Lease.get_lease_objs(lease_elems)
         xpath = '//lease%s | //default:lease%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         lease_elems = xml.xpath(xpath)
         return SFAv1Lease.get_lease_objs(lease_elems)
index 5107698..1931a58 100644 (file)
@@ -125,7 +125,8 @@ class SFAv1Node:
                     node.element.remove(sliver.element)
         
     @staticmethod
                     node.element.remove(sliver.element)
         
     @staticmethod
-    def get_nodes(xml, filter={}):
+    def get_nodes(xml, filter=None):
+        if filter is None: filter={}
         xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         node_elems = xml.xpath(xpath)
         return SFAv1Node.get_node_objs(node_elems)
         xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
         node_elems = xml.xpath(xpath)
         return SFAv1Node.get_node_objs(node_elems)
index b523124..907c962 100644 (file)
@@ -9,7 +9,8 @@ class SFAv1PLTag:
             pl_tag_elem.set_text(value)
               
     @staticmethod
             pl_tag_elem.set_text(value)
               
     @staticmethod
-    def get_pl_tags(xml, ignore=[]):
+    def get_pl_tags(xml, ignore=None):
+        if ignore is None: ignore=[]
         pl_tags = []
         for elem in xml.iterchildren():
             if elem.tag not in ignore:
         pl_tags = []
         for elem in xml.iterchildren():
             if elem.tag not in ignore:
index a2b07a1..7e9282f 100644 (file)
@@ -39,7 +39,8 @@ class SFAv1Sliver:
         return attribs 
                 
     @staticmethod
         return attribs 
                 
     @staticmethod
-    def get_slivers(xml, filter={}):
+    def get_slivers(xml, filter=None):
+        if filter is None: filter={}
         xpath = './default:sliver | ./sliver'
         sliver_elems = xml.xpath(xpath)
         slivers = []
         xpath = './default:sliver | ./sliver'
         sliver_elems = xml.xpath(xpath)
         slivers = []
index 8a66ff3..0f61e90 100755 (executable)
@@ -10,7 +10,8 @@ from sfa.rspecs.version_manager import VersionManager
 
 class RSpec:
  
 
 class RSpec:
  
-    def __init__(self, rspec="", version=None, user_options={}):
+    def __init__(self, rspec="", version=None, user_options=None):
+        if user_options is None: user_options={}
         self.header = '<?xml version="1.0"?>\n'
         self.template = """<RSpec></RSpec>"""
         self.version = None
         self.header = '<?xml version="1.0"?>\n'
         self.template = """<RSpec></RSpec>"""
         self.version = None
@@ -72,15 +73,17 @@ class RSpec:
             raise InvalidRSpecElement(element_type, extra=msg)
         return self.elements[element_type]
 
             raise InvalidRSpecElement(element_type, extra=msg)
         return self.elements[element_type]
 
-    def get(self, element_type, filter={}, depth=0):
+    def get(self, element_type, filter=None, depth=0):
+        if filter is None: filter={}
         elements = self.get_elements(element_type, filter)
         elements = [self.xml.get_element_attributes(elem, depth=depth) for elem in elements]
         return elements
 
         elements = self.get_elements(element_type, filter)
         elements = [self.xml.get_element_attributes(elem, depth=depth) for elem in elements]
         return elements
 
-    def get_elements(self, element_type, filter={}):
+    def get_elements(self, element_type, filter=None):
         """
         search for a registered element
         """
         """
         search for a registered element
         """
+        if filter is None: filter={}
         if element_type not in self.elements:
             msg = "Unable to search for element %s in rspec, expath expression not found." % \
                    element_type
         if element_type not in self.elements:
             msg = "Unable to search for element %s in rspec, expath expression not found." % \
                    element_type
index 9d8045f..ad49157 100644 (file)
@@ -139,7 +139,8 @@ class Iotlabv1(RSpecVersion):
     def add_default_sliver_attribute(self, name, value, network=None):
         pass
 
     def add_default_sliver_attribute(self, name, value, network=None):
         pass
 
-    def add_slivers(self, hostnames, attributes=[], sliver_urn=None, append=False):
+    def add_slivers(self, hostnames, attributes=None, sliver_urn=None, append=False):
+        if attributes is None: attributes=[]
         # all nodes hould already be present in the rspec. Remove all
         # nodes that done have slivers
         print>>sys.stderr, "\r\n \r\n \r\n \t\t\t Iotlabv1.PY add_slivers  ----->get_node "
         # all nodes hould already be present in the rspec. Remove all
         # nodes that done have slivers
         print>>sys.stderr, "\r\n \r\n \r\n \t\t\t Iotlabv1.PY add_slivers  ----->get_node "
index af60d8e..3288b48 100644 (file)
@@ -60,7 +60,8 @@ class NITOSv1(RSpecVersion):
 
     # Slivers
    
 
     # Slivers
    
-    def add_slivers(self, hostnames, attributes=[], sliver_urn=None, append=False):
+    def add_slivers(self, hostnames, attributes=None, sliver_urn=None, append=False):
+        if attributes is None: attributes=[]
         # add slice name to network tag
         network_tags = self.xml.xpath('//network')
         if network_tags:
         # add slice name to network tag
         network_tags = self.xml.xpath('//network')
         if network_tags:
index cd206ff..d074694 100755 (executable)
@@ -86,7 +86,8 @@ class Ofelia(RSpecVersion):
 
     # Slivers
    
 
     # Slivers
    
-    def add_slivers(self, hostnames, attributes=[], sliver_urn=None, append=False):
+    def add_slivers(self, hostnames, attributes=None, sliver_urn=None, append=False):
+        if attributes is None: attributes=[]
         # add slice name to network tag
         network_tags = self.xml.xpath('//network')
         if network_tags:
         # add slice name to network tag
         network_tags = self.xml.xpath('//network')
         if network_tags:
index 80febc9..21183bf 100644 (file)
@@ -103,7 +103,8 @@ class PGv2(RSpecVersion):
     def add_default_sliver_attribute(self, name, value, network=None):
         pass
 
     def add_default_sliver_attribute(self, name, value, network=None):
         pass
 
-    def add_slivers(self, hostnames, attributes=[], sliver_urn=None, append=False):
+    def add_slivers(self, hostnames, attributes=None, sliver_urn=None, append=False):
+        if attributes is None: attributes=[]
         # all nodes hould already be present in the rspec. Remove all
         # nodes that done have slivers
         for hostname in hostnames:
         # all nodes hould already be present in the rspec. Remove all
         # nodes that done have slivers
         for hostname in hostnames:
index 4ee8a4c..6e973e7 100644 (file)
@@ -59,7 +59,8 @@ class SFAv1(RSpecVersion):
 
     # Slivers
    
 
     # Slivers
    
-    def add_slivers(self, hostnames, attributes=[], sliver_urn=None, append=False):
+    def add_slivers(self, hostnames, attributes=None, sliver_urn=None, append=False):
+        if attributes is None: attributes=[]
         # add slice name to network tag
         network_tags = self.xml.xpath('//network')
         if network_tags:
         # add slice name to network tag
         network_tags = self.xml.xpath('//network')
         if network_tags:
index d50d3b6..7c74977 100644 (file)
@@ -410,7 +410,8 @@ def drop_tables(engine):
 
 ##############################
 # create a record of the right type from either a dict or an xml string
 
 ##############################
 # create a record of the right type from either a dict or an xml string
-def make_record (dict={}, xml=""):
+def make_record (dict=None, xml=""):
+    if dict is None: dict={}
     if dict:    return make_record_dict (dict)
     elif xml:   return make_record_xml (xml)
     else:       raise Exception("make_record has no input")
     if dict:    return make_record_dict (dict)
     elif xml:   return make_record_xml (xml)
     else:       raise Exception("make_record has no input")
index 812efde..9fcab19 100644 (file)
@@ -35,7 +35,8 @@ class Record:
     
     # it may be important to exclude relationships, which fortunately
     # 
     
     # it may be important to exclude relationships, which fortunately
     # 
-    def todict (self, exclude_types=[]):
+    def todict (self, exclude_types=None):
+        if exclude_types is None: exclude_types=[]
         d=self.__dict__
         def exclude (k,v):
             if k.startswith('_'): return True
         d=self.__dict__
         def exclude (k,v):
             if k.startswith('_'): return True
index c25ec44..797bed7 100644 (file)
@@ -194,7 +194,8 @@ DO NOT EDIT. This file was automatically generated at
             return False
 
 
             return False
 
 
-    def dump(self, sections = []):
+    def dump(self, sections=None):
+        if sections is None: sections=[]
         sys.stdout.write(output_python())
 
     def output_python(self, encoding = "utf-8"):
         sys.stdout.write(output_python())
 
     def output_python(self, encoding = "utf-8"):
index 793a38e..89a2509 100644 (file)
@@ -9,8 +9,8 @@ class SimpleStorage(dict):
     db_filename = None
     type = 'dict'
     
     db_filename = None
     type = 'dict'
     
-    def __init__(self, db_filename, db = {}):
-
+    def __init__(self, db_filename, db = None):
+        if db is None: db={}
         dict.__init__(self, db)
         self.db_filename = db_filename
     
         dict.__init__(self, db)
         self.db_filename = db_filename
     
index 46b31d3..97ae6c4 100644 (file)
@@ -3,7 +3,8 @@ version_tag="@VERSIONTAG@"
 scm_url="@SCMURL@"
 import socket
  
 scm_url="@SCMURL@"
 import socket
  
-def version_core (more={}):
+def version_core (more=None):
+    if more is None: more={}
     core = { 'code_tag' : version_tag,
              'code_url' : scm_url,
              'hostname' : socket.gethostname(),
     core = { 'code_tag' : version_tag,
              'code_url' : scm_url,
              'hostname' : socket.gethostname(),
index d6734e6..ba324c7 100755 (executable)
@@ -20,7 +20,8 @@ class XpathFilter:
         return xpath
 
     @staticmethod
         return xpath
 
     @staticmethod
-    def xpath(filter={}):
+    def xpath(filter=None):
+        if filter is None: filter={}
         xpath = ""
         if filter:
             filter_list = []
         xpath = ""
         if filter:
             filter_list = []
@@ -78,11 +79,12 @@ class XmlElement:
     def getparent(self):
         return XmlElement(self.element.getparent(), self.namespaces)
 
     def getparent(self):
         return XmlElement(self.element.getparent(), self.namespaces)
 
-    def get_instance(self, instance_class=None, fields=[]):
+    def get_instance(self, instance_class=None, fields=None):
         """
         Returns an instance (dict) of this xml element. The instance
         holds a reference to this xml element.   
         """
         """
         Returns an instance (dict) of this xml element. The instance
         holds a reference to this xml element.   
         """
+        if fields is None: fields=[]
         if not instance_class:
             instance_class = Element
         if not fields and hasattr(instance_class, 'fields'):
         if not instance_class:
             instance_class = Element
         if not fields and hasattr(instance_class, 'fields'):
@@ -97,11 +99,12 @@ class XmlElement:
                    instance[field] = self.attrib[field]  
         return instance             
 
                    instance[field] = self.attrib[field]  
         return instance             
 
-    def add_instance(self, name, instance, fields=[]):
+    def add_instance(self, name, instance, fields=None):
         """
         Adds the specifed instance(s) as a child element of this xml 
         element. 
         """
         """
         Adds the specifed instance(s) as a child element of this xml 
         element. 
         """
+        if fields is None: fields=[]
         if not fields and hasattr(instance, 'keys'):
             fields = instance.keys()
         elem = self.add_element(name)
         if not fields and hasattr(instance, 'keys'):
             fields = instance.keys()
         elem = self.add_element(name)
index b0db4c1..b16ea51 100644 (file)
@@ -110,7 +110,8 @@ class Xrn:
         return Xrn.urn_meaningful(urn).split('+')
 
     @staticmethod
         return Xrn.urn_meaningful(urn).split('+')
 
     @staticmethod
-    def filter_type(urns=[], type=None):
+    def filter_type(urns=None, type=None):
+        if urns is None: urns=[]
         urn_list = []
         if not type:
             return urns
         urn_list = []
         if not type:
             return urns