/**
 * *  Copyright (C) 2011 Citrix Systems, Inc.  All rights reserved
*
 *
 * This software is licensed under the GNU General Public License v3 or later.
 *
 * It is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * 
 * This software is licensed under the GNU General Public License v3 or later.
 * 
 * It is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * @author-aj
 */

package com.cloud.netapp;

import java.net.UnknownHostException;
import java.rmi.ServerException;
import java.util.List;

import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceInUseException;
import com.cloud.utils.component.Manager;

public interface NetappManager  extends Manager {
	enum AlgorithmType {
		RoundRobin,
		LeastFull
	}
	void destroyVolumeOnFiler(String ipAddress, String aggrName, String volName) throws ServerException, InvalidParameterValueException, ResourceInUseException;

	void createVolumeOnFiler(String ipAddress, String aggName, String poolName,
			String volName, String volSize, String snapshotPolicy,
			Integer snapshotReservation, String username, String password)
			throws UnknownHostException, ServerException, InvalidParameterValueException;

	public String[] associateLun(String guestIqn, String path) throws ServerException, InvalidParameterValueException;


	void disassociateLun(String iGroup, String path) throws ServerException, InvalidParameterValueException;

	List<LunVO> listLunsOnFiler(String poolName);

	void destroyLunOnFiler(String path) throws ServerException, InvalidParameterValueException;

	List<NetappVolumeVO> listVolumesOnFiler(String poolName);

	List<NetappVolumeVO> listVolumesAscending(String poolName);

	long returnAvailableVolumeSize(String volName, String userName,
			String password, String serverIp) throws ServerException;

	void createPool(String poolName, String algorithm) throws InvalidParameterValueException;

	void modifyPool(String poolName, String algorithm) throws InvalidParameterValueException;

	void deletePool(String poolName) throws InvalidParameterValueException, ResourceInUseException;

	List<PoolVO> listPools();

	public String[] createLunOnFiler(String poolName, Long lunSize) throws InvalidParameterValueException, ServerException, ResourceAllocationException;

}
