added destroy_instances()
authorTony Mack <tmack@paris.CS.Princeton.EDU>
Tue, 12 Mar 2013 01:09:12 +0000 (21:09 -0400)
committerTony Mack <tmack@paris.CS.Princeton.EDU>
Tue, 12 Mar 2013 01:09:12 +0000 (21:09 -0400)
PLC/Methods/AddSliceToNodes.py
PLC/Methods/DeleteSliceFromNodes.py
PLC/Slices.py

index ff6ec5c..903681e 100644 (file)
@@ -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
index 1a82ad1..b89c681 100644 (file)
@@ -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"
index 6c60b4d..21a8ccf 100644 (file)
@@ -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