From 99b2c2b5e068b21b1208733a77fdf908257c51e5 Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Mon, 11 Mar 2013 21:09:12 -0400 Subject: [PATCH] added destroy_instances() --- PLC/Methods/AddSliceToNodes.py | 2 +- PLC/Methods/DeleteSliceFromNodes.py | 4 ++++ PLC/Slices.py | 27 ++++++++++++++++++++------- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/PLC/Methods/AddSliceToNodes.py b/PLC/Methods/AddSliceToNodes.py index ff6ec5c5..903681e4 100644 --- a/PLC/Methods/AddSliceToNodes.py +++ b/PLC/Methods/AddSliceToNodes.py @@ -51,7 +51,7 @@ class AddSliceToNodes(Method): nodes = Nodes(self.api, node_id_or_hostname_list, ['node_id', 'hostname', 'slice_ids', 'slice_ids_whitelist', 'site_id']) - slice.spawn_instances(nodes, self.caller) + slice.spawn_instances(nodes) for node in nodes: # check the slice whitelist on each node first # allow users at site to add node to slice, ignoring whitelist diff --git a/PLC/Methods/DeleteSliceFromNodes.py b/PLC/Methods/DeleteSliceFromNodes.py index 1a82ad11..b89c681e 100644 --- a/PLC/Methods/DeleteSliceFromNodes.py +++ b/PLC/Methods/DeleteSliceFromNodes.py @@ -47,6 +47,10 @@ class DeleteSliceFromNodes(Method): # Get specified nodes nodes = Nodes(self.api, node_id_or_hostname_list) + + # destroy compute instances + slice.destroy_instances(nodes) + for node in nodes: if slice['peer_id'] is not None and node['peer_id'] is not None: raise PLCPermissionDenied, "Not allowed to remove peer slice from peer node" diff --git a/PLC/Slices.py b/PLC/Slices.py index 6c60b4da..21a8ccf9 100644 --- a/PLC/Slices.py +++ b/PLC/Slices.py @@ -119,7 +119,7 @@ class Slice(AlchemyObj): 'node_id': node['node_id']}) slice_node.sync() - def spawn_instances(self, nodes, caller): + def spawn_instances(self, nodes): # use the caller's nova keypair keypairs = self.api.client_shell.nova.keypairs.list() if not keypairs: @@ -186,12 +186,25 @@ class Slice(AlchemyObj): if not images: raise PLCInvalidArgument('Image bot found') image_id = images[0]['id'] - self.api.client_shell.nova.servers.create(flavor=flavor_id, - image=image_id, - key_name = key_name, - security_group = security_group, - files=files, - name=self['name']) + hints = {'force_hosts': node['hostname']} + 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) + + def destroy_instances(self, nodes): + hostnames = [n['hostname'] for n in nodes] + servers = self.api.client_shell.nova.servers.list() + for server in servers: + name = server.name + hostname = server._info['OS-EXT-SRV-ATTR:host'] + if self['name'] == name and hostname in hostnames: + self.api.client_shell.nova.servers.delete(server) + + def remove_node(self, node_filter, commit=True): from PLC.Nodes import Nodes -- 2.47.0