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
# 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"
'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:
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