From 077f8b5a980198f091954297d689f7717c95c4db Mon Sep 17 00:00:00 2001
From: Tony Mack <tmack@paris.CS.Princeton.EDU>
Date: Sat, 9 Mar 2013 12:40:07 -0500
Subject: [PATCH] fix Slice bugs

---
 PLC/Methods/AddSlice.py |  3 ---
 PLC/Methods/GetSites.py |  2 +-
 PLC/Slices.py           | 23 ++++++++++++++---------
 3 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/PLC/Methods/AddSlice.py b/PLC/Methods/AddSlice.py
index 0274e019..2ca7ae7d 100644
--- a/PLC/Methods/AddSlice.py
+++ b/PLC/Methods/AddSlice.py
@@ -100,7 +100,4 @@ class AddSlice(Method):
             else:
                 UpdateSliceTag(self.api).__call__(auth,slice_tags[0]['slice_tag_id'],value)
 
-        self.event_objects = {'Slice': [slice['slice_id']]}
-        self.message = "Slice %d created" % slice['slice_id']
-
         return slice['slice_id']
diff --git a/PLC/Methods/GetSites.py b/PLC/Methods/GetSites.py
index 2ca1b440..c0c6e329 100644
--- a/PLC/Methods/GetSites.py
+++ b/PLC/Methods/GetSites.py
@@ -28,5 +28,5 @@ class GetSites(Method):
     returns = [Site.fields]
 
     def call(self, auth, site_filter = None, return_fields = None):
-        sites = Sites(self.api, site_filter)
+        sites = Sites(self.api, site_filter, return_fields)
         return sites
diff --git a/PLC/Slices.py b/PLC/Slices.py
index 570256a1..bbc594ab 100644
--- a/PLC/Slices.py
+++ b/PLC/Slices.py
@@ -1,7 +1,7 @@
 from types import StringTypes
 import time
 import re
-import datetime
+from datetime import datetime, timedelta
 
 from PLC.Faults import *
 from PLC.Parameter import Parameter, Mixed
@@ -32,7 +32,7 @@ class Slice(AlchemyObj):
         'instantiation': Parameter(str, "Slice instantiation state", nullok=True),
         'url': Parameter(str, "URL further describing this slice", max = 254, nullok = True),
         'description': Parameter(str, "Slice description", max = 2048, nullok = True),
-        'max_nodes': Parameter(int, "Maximum number of nodes that can be assigned to this slice"),
+        'max_nodes': Parameter(int, "Maximum number of nodes that can be assigned to this slice", default=100),
         'creator_person_id': Parameter(str, "Identifier of the account that created this slice"),
         'created': Parameter(datetime, "Date and time when slice was created, in seconds since UNIX epoch", ro = True),
         'expires': Parameter(datetime, "Date and time when slice expires, in seconds since UNIX epoch"),
@@ -134,17 +134,23 @@ class Slice(AlchemyObj):
         # sync the nova record and the plc record
         AlchemyObj.sync(self, commit=commit, validate=validate)
         # create the nova record
-        nova_fields = ['enabled', 'name', 'description']
+        nova_fields = ['enabled', 'description']
         nova_can_update = lambda (field, value): field in nova_fields
         nova_slice = dict(filter(nova_can_update, self.items()))
+        nova_slice['tenant_name'] = self['name']
         if 'slice_id' not in self:
+            now = datetime.now()
             # Before a new slice is added, delete expired slices
             #expired = Slices(self.api, expires = -int(time.time()))
             #for slice in expired:
             #    slice.delete(commit)
             self.object = self.api.client_shell.keystone.tenants.create(**nova_slice)
             self['tenant_id'] = self.object.id
+            self['created'] = now
+            self['expires'] = now + timedelta(days=14)
             AlchemyObj.insert(self, dict(self))
+            slice = AlchemyObj.select(self, filter={'tenant_id': self['tenant_id']})[0]
+            self['slice_id'] = slice.slice_id
         else:
             self.object = self.api.client_shell.keystone.tenants.update(self['tenant_id'], **nova_slice) 
             AlchemyObj.update(self, {'slice_id': self['slice_id']}, dict(self)) 
@@ -169,8 +175,7 @@ class Slice(AlchemyObj):
             slice_tag.delete()
         
         # delete slice 
-        AlchemyObj.delete(self, dict(self))
-
+        AlchemyObj.delete(self, filter={'slice_id': self['slice_id']})
 
 class Slices(list):
     """
@@ -189,22 +194,22 @@ class Slices(list):
             slices = Slice().select(filter=slice_filter)
         elif isinstance(slice_filter, (list, tuple, set)):
             slices = Slice().select()
-            slices = [slice for slice in slices if slice.id in slice_filter]
+            slices = [slice for slice in slices if slice.slice_id in slice_filter or slice.name in slice_filter]
         else:
             raise PLCInvalidArgument, "Wrong slice filter %r"%slice_filter
 
         for slice in slices:
             slice = Slice(api, object=slice)
             if not columns or 'person_ids' in columns:
-                slice_persons = SlicePerson().select(filter={'slice_id': slice.id})
+                slice_persons = SlicePerson().select(filter={'slice_id': slice['slice_id']})
                 slice['person_ids'] = [rec.person_id for rec in slice_persons] 
                 
             if not columns or 'node_ids' in columns:
-                slice_nodes = SliceNode().select(filter={'slice_id': slice.id})
+                slice_nodes = SliceNode().select(filter={'slice_id': slice['slice_id']})
                 slice['node_ids'] = [rec.node_id for rec in slice_nodes]
 
             if not columns or 'slice_tag_ids' in columns:
-                slice_tags = SliceTag().select(filter={'slice_id': slice.id})
+                slice_tags = SliceTag().select(filter={'slice_id': slice['slice_id']})
                 slice['slice_tag_ids'] = [rec.slice_tag_id for rec in slice_tags]
                 
             self.append(slice)
-- 
2.47.0