code: @Override
  	public void terminateMachine( TargetHandlerParameters parameters, String machineId ) throws TargetException {
  
  		try {
  			this.logger.info( "Terminating Openstack machine. Machine ID: " + machineId );
  			cancelMachineConfigurator( machineId );
  
  			NovaApi novaApi = novaApi( parameters.getTargetProperties());
  			String zoneName = findZoneName( novaApi, parameters.getTargetProperties());
  
  			// List the attached volumes, if any.
  			Set<String> volumeIds = new HashSet<> ();
  			VolumeAttachmentApi volumeAttachmentApi = novaApi.getVolumeAttachmentExtensionForZone( zoneName ).get();
  			for( VolumeAttachment vol : volumeAttachmentApi.listAttachmentsOnServer( machineId )) {
  				volumeIds.add( vol.getVolumeId());
  			}
  
  			// Delete the VM
  			novaApi.getServerApiForZone( zoneName ).delete( machineId );
  
  			// Delete the volumes?
  			VolumeApi volumeApi = novaApi.getVolumeExtensionForZone( zoneName ).get();
  			for( String volumeId : volumeIds ) {
  
  				Volume volume = volumeApi.get( volumeId );
  				if( volume == null ) {
  					this.logger.warning( "Volume " + volumeId + " was not found. Deletion check is aborted for this volume." );
  					continue;
  				}
  
  				String del = volume.getMetadata().get( DELETE_ON_TERMINATION );
  				if( Boolean.parseBoolean( del )) {
  					this.logger.info( "Deleting volume " + volumeId );
  					volumeApi.delete( volumeId );
  
  				} else {
  					this.logger.info( "Orphan volume " + volumeId + " is kept and will not be deleted." );
  				}
  			}
  
  			novaApi.close();
  
  		} catch( IOException e ) {
  			throw new TargetException( e );
  		}
  	}
docs: /*
  (non-Javadoc)
  @see net.roboconf.target.api.TargetHandler
  #terminateMachine(net.roboconf.target.api.TargetHandlerParameters, java.lang.String)