X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FSlices.py;fp=PLC%2FSlices.py;h=e5f1823b537fa42f244ce663165993489ca254cb;hb=952c83c9dc4cef2e7c746281247883ac9d4685f3;hp=21a8ccf93a823be47be5ae9bc56343916df9db50;hpb=99b2c2b5e068b21b1208733a77fdf908257c51e5;p=plcapi.git diff --git a/PLC/Slices.py b/PLC/Slices.py index 21a8ccf..e5f1823 100644 --- a/PLC/Slices.py +++ b/PLC/Slices.py @@ -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.SliceInstances import SliceInstance, SliceInstances 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), + '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), @@ -187,13 +189,17 @@ class Slice(AlchemyObj): 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, - 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] @@ -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: + instance_id = server.id 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): @@ -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() + 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() @@ -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['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: - 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']})