keep track of slice instances
[plcapi.git] / PLC / Slices.py
index 21a8ccf..e5f1823 100644 (file)
@@ -12,6 +12,7 @@ from PLC.Nodes import Node
 from PLC.Persons import Person, Persons
 from PLC.SlicePersons import SlicePerson, SlicePersons
 from PLC.SliceNodes import SliceNode, SliceNodes
 from PLC.Persons import Person, Persons
 from PLC.SlicePersons import SlicePerson, SlicePersons
 from PLC.SliceNodes import SliceNode, SliceNodes
+from PLC.SliceInstances import SliceInstance, SliceInstances
 from PLC.SliceTags import SliceTag, SliceTags
 from PLC.Timestamp import Timestamp
 from PLC.Storage.AlchemyObject import AlchemyObj
 from PLC.SliceTags import SliceTag, SliceTags
 from PLC.Timestamp import Timestamp
 from PLC.Storage.AlchemyObject import AlchemyObj
@@ -39,6 +40,7 @@ class Slice(AlchemyObj):
         '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"),
         'node_ids': Parameter([str], "List of nodes in this slice", joined = True),
         '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"),
         'node_ids': Parameter([str], "List of nodes in this slice", joined = True),
+        'instance_ids': Parameter([str], "List of instances running under this slice", joined = True),
         'person_ids': Parameter([str], "List of accounts that can use this slice", joined = True),
         'slice_tag_ids': Parameter([int], "List of slice attributes", joined = True),
         'peer_id': Parameter(int, "Peer to which this slice belongs", nullok = True),
         'person_ids': Parameter([str], "List of accounts that can use this slice", joined = True),
         'slice_tag_ids': Parameter([int], "List of slice attributes", joined = True),
         'peer_id': Parameter(int, "Peer to which this slice belongs", nullok = True),
@@ -187,13 +189,17 @@ class Slice(AlchemyObj):
                     raise PLCInvalidArgument('Image bot found')
                 image_id = images[0]['id']
                 hints = {'force_hosts': node['hostname']}
                     raise PLCInvalidArgument('Image bot found')
                 image_id = images[0]['id']
                 hints = {'force_hosts': node['hostname']}
-                self.api.client_shell.nova.servers.create(name=self['name'],
+                server = self.api.client_shell.nova.servers.create(
+                                                    name=self['name'],
                                                     flavor=flavor_id,
                                                     image=image_id,
                                                     key_name = key_name,
                                                     security_group = security_group,
                                                     files=files,
                                                     flavor=flavor_id,
                                                     image=image_id,
                                                     key_name = key_name,
                                                     security_group = security_group,
                                                     files=files,
-                                                    scheduler_hints=hints)             
+                                                    scheduler_hints=hints)
+                slice_instance = SliceInstance(self.api, {'slice_id': self['slice_id'],
+                                                          'instance_id': server.id})
+                slice_instance.sync()               
 
     def destroy_instances(self, nodes):
         hostnames = [n['hostname'] for n in nodes]
 
     def destroy_instances(self, nodes):
         hostnames = [n['hostname'] for n in nodes]
@@ -202,8 +208,10 @@ class Slice(AlchemyObj):
             name = server.name
             hostname = server._info['OS-EXT-SRV-ATTR:host']
             if self['name'] == name and hostname in hostnames:
             name = server.name
             hostname = server._info['OS-EXT-SRV-ATTR:host']
             if self['name'] == name and hostname in hostnames:
+                instance_id = server.id
                 self.api.client_shell.nova.servers.delete(server)
                 self.api.client_shell.nova.servers.delete(server)
-                
+                AlchemyObj.delete(SliceInstance, filter={'slice_id': self['slice_id'],
+                                                         'instance_id': instance_id})
              
  
     def remove_node(self, node_filter, commit=True):
              
  
     def remove_node(self, node_filter, commit=True):
@@ -262,6 +270,8 @@ class Slice(AlchemyObj):
             slice_person.delete()
         for slice_node in SliceNode().select(filter={'slice_id': self['slice_id']}):
             slice_node.delete()
             slice_person.delete()
         for slice_node in SliceNode().select(filter={'slice_id': self['slice_id']}):
             slice_node.delete()
+        for slice_instance in SliceInstance().select(filter={'slice_id': self['slice_id']}):
+            slice_instance.delete()      
         for slice_tag in SliceTag().select(filter={'slice_id': self['slice_id']}):
             slice_tag.delete()
         
         for slice_tag in SliceTag().select(filter={'slice_id': self['slice_id']}):
             slice_tag.delete()
         
@@ -293,11 +303,22 @@ class Slices(list):
             slice = Slice(api, object=slice)
             if not columns or 'person_ids' in columns:
                 slice_persons = SlicePerson().select(filter={'slice_id': slice['slice_id']})
             slice = Slice(api, object=slice)
             if not columns or 'person_ids' in columns:
                 slice_persons = SlicePerson().select(filter={'slice_id': slice['slice_id']})
-                slice['person_ids'] = [rec.person_id for rec in slice_persons] 
-                
+                slice['person_ids'] = [rec.person_id for rec in slice_persons]
+            
+            # we need to get the instance ids if node_ids is  specified
+            if not columns or 'instance_ids' in columns or 'node_ids' in columns:  
+                slice_instances = SliceInstance().select(filter={'slice_id': slice['slice_id']})
+                slice['instance_ids'] = [rec.instance_id for rec in slice_instances]
             if not columns or 'node_ids' in columns:
             if not columns or 'node_ids' in columns:
-                slice_nodes = SliceNode().select(filter={'slice_id': slice['slice_id']})
-                slice['node_ids'] = [rec.node_id for rec in slice_nodes]
+                #slice_nodes = SliceNode().select(filter={'slice_id': slice['slice_id']})
+                #slice['node_ids'] = [rec.node_id for rec in slice_nodes]
+                # need to look up the manually look up each instance's host and query plc
+                # for the node ids
+                instances = api.client_shell.nova.servers.list()
+                hostnames = [s._info['OS-EXT-SRV-ATTR:host'] for s in instances \
+                             if s.id in slice['instance_ids']]
+                nodes = Node().select(filter={'hostname': hostnames})
+                slice['node_ids'] = [rec.node_id for rec in nodes]
 
             if not columns or 'slice_tag_ids' in columns:
                 slice_tags = SliceTag().select(filter={'slice_id': slice['slice_id']})
 
             if not columns or 'slice_tag_ids' in columns:
                 slice_tags = SliceTag().select(filter={'slice_id': slice['slice_id']})