You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mu...@apache.org on 2012/07/02 17:35:04 UTC

[1/4] git commit: moving out NetApp code to plugins/file-systems/netapp

Updated Branches:
  refs/heads/master 1581d65c9 -> 8aa2b55dd


moving out NetApp code to plugins/file-systems/netapp


Project: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/commit/8aa2b55d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/tree/8aa2b55d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/diff/8aa2b55d

Branch: refs/heads/master
Commit: 8aa2b55dd62cf488b63b7377610e1d8aa14a2fc6
Parents: 1581d65
Author: Murali reddy <Mu...@citrix.com>
Authored: Fri Jun 29 15:02:27 2012 -0700
Committer: Murali reddy <Mu...@citrix.com>
Committed: Mon Jul 2 08:34:02 2012 -0700

----------------------------------------------------------------------
 build/build-cloud-plugins.xml                      |   16 +-
 client/tomcatconf/components.xml.in                |    4 +
 plugins/file-systems/netapp/.classpath             |   11 +
 plugins/file-systems/netapp/.project               |   17 +
 plugins/file-systems/netapp/build.xml              |  129 ++
 .../cloud/api/commands/netapp/AssociateLunCmd.java |  100 ++
 .../cloud/api/commands/netapp/CreateLunCmd.java    |   98 ++
 .../commands/netapp/CreateVolumeOnFilerCmd.java    |  146 ++
 .../api/commands/netapp/CreateVolumePoolCmd.java   |   84 ++
 .../api/commands/netapp/DeleteVolumePoolCmd.java   |   76 ++
 .../cloud/api/commands/netapp/DestroyLunCmd.java   |   78 ++
 .../commands/netapp/DestroyVolumeOnFilerCmd.java   |   87 ++
 .../api/commands/netapp/DissociateLunCmd.java      |   79 ++
 .../com/cloud/api/commands/netapp/ListLunsCmd.java |   88 ++
 .../api/commands/netapp/ListVolumePoolsCmd.java    |   84 ++
 .../api/commands/netapp/ListVolumesOnFilerCmd.java |   94 ++
 .../api/commands/netapp/ModifyVolumePoolCmd.java   |   73 +
 .../netapp/src/com/cloud/netapp/LunVO.java         |  121 ++
 .../src/com/cloud/netapp/NetappAllocator.java      |   25 +
 .../cloud/netapp/NetappDefaultAllocatorImpl.java   |  142 ++
 .../netapp/src/com/cloud/netapp/NetappManager.java |   66 +
 .../src/com/cloud/netapp/NetappManagerImpl.java    | 1040 +++++++++++++++
 .../src/com/cloud/netapp/NetappVolumeVO.java       |  183 +++
 .../netapp/src/com/cloud/netapp/PoolVO.java        |   74 +
 .../netapp/src/com/cloud/netapp/dao/LunDao.java    |   31 +
 .../src/com/cloud/netapp/dao/LunDaoImpl.java       |   70 +
 .../netapp/src/com/cloud/netapp/dao/PoolDao.java   |   28 +
 .../src/com/cloud/netapp/dao/PoolDaoImpl.java      |   67 +
 .../netapp/src/com/cloud/netapp/dao/VolumeDao.java |   30 +
 .../src/com/cloud/netapp/dao/VolumeDaoImpl.java    |   99 ++
 .../cloud/api/commands/netapp/AssociateLunCmd.java |  100 --
 .../cloud/api/commands/netapp/CreateLunCmd.java    |   98 --
 .../commands/netapp/CreateVolumeOnFilerCmd.java    |  146 --
 .../api/commands/netapp/CreateVolumePoolCmd.java   |   84 --
 .../api/commands/netapp/DeleteVolumePoolCmd.java   |   76 --
 .../cloud/api/commands/netapp/DestroyLunCmd.java   |   78 --
 .../commands/netapp/DestroyVolumeOnFilerCmd.java   |   87 --
 .../api/commands/netapp/DissociateLunCmd.java      |   79 --
 .../com/cloud/api/commands/netapp/ListLunsCmd.java |   88 --
 .../api/commands/netapp/ListVolumePoolsCmd.java    |   84 --
 .../api/commands/netapp/ListVolumesOnFilerCmd.java |   94 --
 .../api/commands/netapp/ModifyVolumePoolCmd.java   |   73 -
 .../configuration/PremiumComponentLibrary.java     |    8 -
 server/src/com/cloud/netapp/LunVO.java             |  121 --
 server/src/com/cloud/netapp/NetappAllocator.java   |   25 -
 .../cloud/netapp/NetappDefaultAllocatorImpl.java   |  142 --
 server/src/com/cloud/netapp/NetappManager.java     |   66 -
 server/src/com/cloud/netapp/NetappManagerImpl.java | 1040 ---------------
 server/src/com/cloud/netapp/NetappVolumeVO.java    |  183 ---
 server/src/com/cloud/netapp/PoolVO.java            |   74 -
 server/src/com/cloud/netapp/dao/LunDao.java        |   31 -
 server/src/com/cloud/netapp/dao/LunDaoImpl.java    |   70 -
 server/src/com/cloud/netapp/dao/PoolDao.java       |   28 -
 server/src/com/cloud/netapp/dao/PoolDaoImpl.java   |   67 -
 server/src/com/cloud/netapp/dao/VolumeDao.java     |   30 -
 server/src/com/cloud/netapp/dao/VolumeDaoImpl.java |   99 --
 56 files changed, 3238 insertions(+), 3073 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/build/build-cloud-plugins.xml
----------------------------------------------------------------------
diff --git a/build/build-cloud-plugins.xml b/build/build-cloud-plugins.xml
index a464de9..dcadb93 100755
--- a/build/build-cloud-plugins.xml
+++ b/build/build-cloud-plugins.xml
@@ -184,9 +184,9 @@
   </path>
 
 
-  <target name="compile-plugins" description="Compile all of the jars corresponding to plugins" depends="compile-utils, compile-api, compile-core, compile-server, compile-hypervisors, compile-deployment-planners, compile-host-allocators, compile-network-elements, compile-user-authenticators, compile-storage-allocators "/>
+  <target name="compile-plugins" description="Compile all of the jars corresponding to plugins" depends="compile-utils, compile-api, compile-core, compile-server, compile-hypervisors, compile-deployment-planners, compile-host-allocators, compile-network-elements, compile-user-authenticators, compile-storage-allocators, compile-file-systems "/>
 
-  <target name="build-plugins" depends="build-hypervisors, build-network-elements, build-deployment-planners, build-host-allocators, build-storage-allocators, build-user-authenticators" description="Builds all jar's for the plug-in's"/>
+  <target name="build-plugins" depends="build-hypervisors, build-network-elements, build-deployment-planners, build-host-allocators, build-storage-allocators, build-user-authenticators, build-file-systems" description="Builds all jar's for the plug-in's"/>
 
   <target name="clean-plugins" description="Clean all of the generated files by the plugins">
       <delete file="${build.log}" />
@@ -302,4 +302,16 @@
   </target>
   <target name="build-ovs" depends="compile-ovs"/>
 
+
+  <!-- ===================== File Systems ===================== -->
+
+  <target name="compile-file-systems" depends="compile-netapp" description="Compils all supported file systems"/>
+  <target name="build-file-systems" depends="build-netapp" description="Builds all supported file systems"/>
+ 
+  <target name="compile-netapp" depends="-init, compile-server" description="Compile NetApp plugin">
+  	<ant antfile="${base.dir}/plugins/file-systems/netapp/build.xml" target="build"/>
+  </target>
+  <target name="build-netapp" depends="compile-netapp"/>
+
+
 </project>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/client/tomcatconf/components.xml.in
----------------------------------------------------------------------
diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in
index c81e3f0..e4e062a 100755
--- a/client/tomcatconf/components.xml.in
+++ b/client/tomcatconf/components.xml.in
@@ -168,6 +168,10 @@
         <dao name="CiscoNexusVSMDeviceDao" class="com.cloud.network.dao.CiscoNexusVSMDeviceDaoImpl" singleton="false"/>
         <dao name="OvsTunnelInterfaceDao" class="com.cloud.network.ovs.dao.OvsTunnelInterfaceDaoImpl" singleton="false"/>
         <dao name="OvsTunnelAccountDao" class="com.cloud.network.ovs.dao.OvsTunnelNetworkDaoImpl" singleton="false"/>
+        <dao name="NetappPool" class="com.cloud.netapp.dao.PoolDaoImpl" singleton="false"/>
+        <dao name="NetappVolume" class="com.cloud.netapp.dao.VolumeDaoImpl" singleton="false"/>
+        <dao name="NetappLun" class="com.cloud.netapp.dao.LunDaoImpl" singleton="false"/>
+        <manager name="NetappManager" key="com.cloud.netapp.NetappManager" class="com.cloud.netapp.NetappManagerImpl"/>
     </management-server>
 
     <configuration-server class="com.cloud.server.ConfigurationServerImpl">

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/.classpath
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/.classpath b/plugins/file-systems/netapp/.classpath
new file mode 100644
index 0000000..a3f5d12
--- /dev/null
+++ b/plugins/file-systems/netapp/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/api"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/core"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/server"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/utils"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/deps"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/.project
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/.project b/plugins/file-systems/netapp/.project
new file mode 100644
index 0000000..a4445c2
--- /dev/null
+++ b/plugins/file-systems/netapp/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>netapp</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/build.xml
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/build.xml b/plugins/file-systems/netapp/build.xml
new file mode 100755
index 0000000..6326e14
--- /dev/null
+++ b/plugins/file-systems/netapp/build.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+
+<project name="Cloud Stack Netapp FS" default="help" basedir=".">
+  <description>
+		Cloud Stack ant build file
+    </description>
+
+  <dirname property="netapp.base.dir" file="${ant.file.Cloud Stack Netapp FS}/"/>
+  <!-- This directory must be set -->
+  <property name="top.dir" location="${netapp.base.dir}/../../.."/>
+  <property name="build.dir" location="${top.dir}/build"/>
+	
+	<echo message="build.dir=${build.dir}; top.dir=${top.dir}; netapp.base.dir=${netapp.base.dir}"/>
+
+  <!-- Import anything that the user wants to set-->
+  <!-- Import properties files and environment variables here -->
+
+  <property environment="env" />
+
+  <condition property="build-cloud.properties.file" value="${build.dir}/override/build-cloud.properties" else="${build.dir}/build-cloud.properties">
+    <available file="${build.dir}/override/build-cloud.properties" />
+  </condition>
+
+  <condition property="cloud.properties.file" value="${build.dir}/override/cloud.properties" else="${build.dir}/cloud.properties">
+    <available file="${build.dir}/override/cloud.properties" />
+  </condition>
+
+  <condition property="override.file" value="${build.dir}/override/replace.properties" else="${build.dir}/replace.properties">
+    <available file="${build.dir}/override/replace.properties" />
+  </condition>
+
+  <echo message="Using build parameters from ${build-cloud.properties.file}" />
+  <property file="${build-cloud.properties.file}" />
+
+  <echo message="Using company info from ${cloud.properties.file}" />
+  <property file="${cloud.properties.file}" />
+
+  <echo message="Using override file from ${override.file}" />
+  <property file="${override.file}" />
+
+  <property file="${build.dir}/build.number" />
+
+  <!-- In case these didn't get defined in the build-cloud.properties -->
+  <property name="branding.name" value="default" />
+  <property name="deprecation" value="off" />
+  <property name="target.compat.version" value="1.6" />
+  <property name="source.compat.version" value="1.6" />
+  <property name="debug" value="true" />
+  <property name="debuglevel" value="lines,source"/>
+
+  <echo message="target.dir=${target.dir}; top.dir=${top.dir}"/>
+  <!-- directories for build and distribution -->
+  <property name="target.dir" location="${top.dir}/target" />
+  <property name="classes.dir" location="${target.dir}/classes" />
+  <property name="jar.dir" location="${target.dir}/jar" />
+  <property name="dep.cache.dir" location="${target.dir}/dep-cache" />
+  <property name="build.log" location="${target.dir}/ant_verbose.txt" />
+
+  <property name="deps.dir" location="${top.dir}/deps" />
+  
+  <property name="cloud-plugin-netapp.jar" value="cloud-plugin-netapp.jar" />
+	
+  <import file="${build.dir}/build-common.xml"/>
+
+  <echo message="target.dir=${target.dir}; top.dir=${top.dir}"/>
+	
+  <!-- This section needs to be replaced by some kind of dependency library-->
+  <path id="deps.classpath">
+    <!--filelist files="${deps.classpath}" /-->
+    <fileset dir="${deps.dir}" erroronmissingdir="false">
+      <include name="*.jar" />
+    </fileset>
+  </path>
+	
+  <path id="cloudstack.classpath">
+  	<fileset dir="${jar.dir}">
+  	  <include name="*.jar"/>
+    </fileset>
+  </path>
+	
+  <path id="netapp.classpath">
+	<path refid="deps.classpath"/>
+  	<path refid="cloudstack.classpath"/>
+  </path>
+	
+  <!-- This section needs to be replaced by some kind of dependency library-->
+
+  <target name="deploy-netapp" >
+  </target>
+
+  <target name="init" description="Initialize binaries directory">
+  	<mkdir dir="${classes.dir}/${cloud-plugin-netapp.jar}"/>
+  	<mkdir dir="${jar.dir}"/>
+  </target>
+
+  <target name="compile-netapp" depends="init" description="Compile Netapp filesystem">
+    <compile-java jar.name="${cloud-plugin-netapp.jar}" top.dir="${netapp.base.dir}" classpath="netapp.classpath" />
+  </target>
+
+  <target name="clean-netapp">
+    <delete dir="${classes.dir}/${cloud-plugin-netapp.jar}"/>
+  </target>
+	
+  <target name="build" depends="compile-netapp"/>
+  <target name="clean" depends="clean-netapp"/>
+
+  <target name="help" description="help">
+    <echo level="info" message="This is the build file for NetApp FS for CloudStack"/>
+    <echo level="info" message="You can do a build by doing ant build or clean by doing ant clean" />
+  </target>
+
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/AssociateLunCmd.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/AssociateLunCmd.java b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/AssociateLunCmd.java
new file mode 100644
index 0000000..db317e0
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/AssociateLunCmd.java
@@ -0,0 +1,100 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.api.commands.netapp;
+
+import java.rmi.ServerException;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.api.ApiConstants;
+import com.cloud.api.BaseCmd;
+import com.cloud.api.Implementation;
+import com.cloud.api.Parameter;
+import com.cloud.api.ServerApiException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.netapp.NetappManager;
+import com.cloud.server.ManagementService;
+import com.cloud.server.api.response.netapp.AssociateLunCmdResponse;
+import com.cloud.utils.component.ComponentLocator;
+
+@Implementation(description="Associate a LUN with a guest IQN", responseObject = AssociateLunCmdResponse.class)
+public class AssociateLunCmd extends BaseCmd {
+	public static final Logger s_logger = Logger.getLogger(AssociateLunCmd.class.getName());
+    private static final String s_name = "associatelunresponse";
+
+	/////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+    
+    @Parameter(name=ApiConstants.NAME, type=CommandType.STRING, required = true, description="LUN name.")
+	private String lunName;
+    
+    @Parameter(name=ApiConstants.IQN, type=CommandType.STRING, required = true, description="Guest IQN to which the LUN associate.")
+	private String guestIqn;
+    
+    
+    ///////////////////////////////////////////////////
+	/////////////////// Accessors ///////////////////////
+	/////////////////////////////////////////////////////
+	 
+    
+    public String getLunName() {
+        return lunName;
+    }
+    
+    public String getGuestIQN() {
+    	return guestIqn;
+    }
+    
+	/////////////////////////////////////////////////////
+	/////////////// API Implementation///////////////////
+	/////////////////////////////////////////////////////
+
+	@Override
+	public String getCommandName() {
+		return s_name;
+	}
+	
+    @Override
+    public void execute(){
+    	ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
+    	NetappManager netappMgr = locator.getManager(NetappManager.class);
+    	
+    	try {
+    		AssociateLunCmdResponse response = new AssociateLunCmdResponse();
+    		String returnVals[] = null;
+    		returnVals = netappMgr.associateLun(getGuestIQN(), getLunName());
+    		response.setLun(returnVals[0]);
+    		response.setIpAddress(returnVals[2]);
+    		response.setTargetIQN(returnVals[1]);
+    		response.setObjectName("lun");
+    		response.setResponseName(getCommandName());
+    		this.setResponseObject(response);
+    	} catch (ServerException e) {
+    		throw new ServerApiException(BaseCmd.PARAM_ERROR, e.toString());
+    	} catch (InvalidParameterValueException e) {
+    		throw new ServerApiException(BaseCmd.INTERNAL_ERROR, e.toString());
+    	}
+    }
+
+	@Override
+	public long getEntityOwnerId() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/CreateLunCmd.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/CreateLunCmd.java b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/CreateLunCmd.java
new file mode 100644
index 0000000..2e0eb86
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/CreateLunCmd.java
@@ -0,0 +1,98 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.api.commands.netapp;
+
+import java.rmi.ServerException;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.api.ApiConstants;
+import com.cloud.api.BaseCmd;
+import com.cloud.api.Implementation;
+import com.cloud.api.Parameter;
+import com.cloud.api.ServerApiException;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.netapp.NetappManager;
+import com.cloud.server.ManagementService;
+import com.cloud.server.api.response.netapp.CreateLunCmdResponse;
+import com.cloud.utils.component.ComponentLocator;
+
+@Implementation(description="Create a LUN from a pool", responseObject = CreateLunCmdResponse.class)
+public class CreateLunCmd extends BaseCmd {
+	public static final Logger s_logger = Logger.getLogger(CreateLunCmd.class.getName());
+    private static final String s_name = "createlunresponse";
+    
+    /////////////////////////////////////////////////////
+    //////////////// API parameters /////////////////////
+    /////////////////////////////////////////////////////
+    
+    @Parameter(name=ApiConstants.NAME, type=CommandType.STRING, required = true, description="pool name.")
+	private String poolName;
+    
+    @Parameter(name=ApiConstants.SIZE, type=CommandType.LONG, required = true, description="LUN size.")
+    private long size;
+    
+    public String getPoolName() {
+    	return poolName;
+    }
+    
+    public long getLunSize() {
+    	return size;
+    }
+
+	@Override
+	public void execute() throws ResourceUnavailableException,
+			InsufficientCapacityException, ServerApiException,
+			ConcurrentOperationException, ResourceAllocationException {
+		ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
+    	NetappManager netappMgr = locator.getManager(NetappManager.class);
+    	
+    	try {
+    		CreateLunCmdResponse response = new CreateLunCmdResponse();
+    		String returnVals[] = null;
+    		returnVals = netappMgr.createLunOnFiler(getPoolName(), getLunSize());
+    		response.setPath(returnVals[0]);
+    		response.setIqn(returnVals[1]);
+    		response.setIpAddress(returnVals[2]);
+    		response.setObjectName("lun");
+    		response.setResponseName(getCommandName());
+    		this.setResponseObject(response);
+    	} catch (ServerException e) {
+    		throw new ServerApiException(BaseCmd.PARAM_ERROR, e.toString());
+    	} catch (InvalidParameterValueException e) {
+    		throw new ServerApiException(BaseCmd.INTERNAL_ERROR, e.toString());
+    	}
+		
+	}
+
+	@Override
+	public String getCommandName() {
+		// TODO Auto-generated method stub
+		return s_name;
+	}
+
+	@Override
+	public long getEntityOwnerId() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/CreateVolumeOnFilerCmd.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/CreateVolumeOnFilerCmd.java b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/CreateVolumeOnFilerCmd.java
new file mode 100644
index 0000000..a301dee
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/CreateVolumeOnFilerCmd.java
@@ -0,0 +1,146 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.api.commands.netapp;
+
+import java.net.UnknownHostException;
+import java.rmi.ServerException;
+
+import com.cloud.api.ApiConstants;
+import com.cloud.api.BaseCmd;
+import com.cloud.api.Implementation;
+import com.cloud.api.Parameter;
+import com.cloud.api.ServerApiException;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.netapp.NetappManager;
+import com.cloud.server.ManagementService;
+import com.cloud.server.api.response.netapp.CreateVolumeOnFilerCmdResponse;
+import com.cloud.utils.component.ComponentLocator;
+
+@Implementation(description="Create a volume", responseObject = CreateVolumeOnFilerCmdResponse.class)
+public class CreateVolumeOnFilerCmd extends BaseCmd {
+    private static final String s_name = "createvolumeresponse";
+
+    @Parameter(name=ApiConstants.IP_ADDRESS, type=CommandType.STRING, required = true, description="ip address.")
+	private String ipAddress;
+    
+    @Parameter(name=ApiConstants.AGGREGATE_NAME, type=CommandType.STRING, required = true, description="aggregate name.")
+	private String aggrName;
+
+    @Parameter(name=ApiConstants.POOL_NAME, type=CommandType.STRING, required = true, description="pool name.")
+	private String poolName;
+    
+    @Parameter(name=ApiConstants.VOLUME_NAME, type=CommandType.STRING, required = true, description="volume name.")
+	private String volName;
+    
+    @Parameter(name=ApiConstants.SIZE, type=CommandType.INTEGER, required = true, description="volume size.")
+	private Integer volSize;
+    
+    @Parameter(name=ApiConstants.SNAPSHOT_POLICY, type=CommandType.STRING, required = false, description="snapshot policy.")
+	private String snapshotPolicy;
+    
+    @Parameter(name=ApiConstants.SNAPSHOT_RESERVATION, type=CommandType.INTEGER, required = false, description="snapshot reservation.")
+	private Integer snapshotReservation;
+    
+    @Parameter(name=ApiConstants.USERNAME, type=CommandType.STRING, required = true, description="user name.")
+	private String userName;
+    
+    @Parameter(name=ApiConstants.PASSWORD, type=CommandType.STRING, required = true, description="password.")
+	private String password;
+    
+
+    public String getIpAddress() {
+    	return ipAddress;
+    }
+    
+    public String getAggrName() {
+    	return aggrName;
+    }
+    
+    public String getPoolName() {
+    	return poolName;
+    }
+    
+    public String volName() {
+    	return volName;
+    }
+    
+    public Integer getVolSize() {
+    	return volSize;
+    }
+    
+    public String getSnapshotPolicy() {
+    	return snapshotPolicy;
+    }
+    
+    public Integer getSnapshotReservation() {
+    	return snapshotReservation;
+    }
+    
+    public String getUserName() {
+    	return userName;
+    }
+    
+    public String getPassword() {
+    	return password;
+    }
+
+	@Override
+	public void execute() throws ResourceUnavailableException,
+			InsufficientCapacityException, ServerApiException,
+			ConcurrentOperationException, ResourceAllocationException {
+		//param checks
+		if(snapshotReservation != null && (snapshotReservation<0 || snapshotReservation>100))
+			throw new InvalidParameterValueException("Invalid snapshot reservation");
+		
+		ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
+    	NetappManager netappMgr = locator.getManager(NetappManager.class);
+    	
+		StringBuilder s = new StringBuilder(getVolSize().toString());
+		s.append("g");
+	
+		try {
+			netappMgr.createVolumeOnFiler(ipAddress, aggrName, poolName, volName, s.toString(), snapshotPolicy, snapshotReservation, userName, password);
+			CreateVolumeOnFilerCmdResponse response = new CreateVolumeOnFilerCmdResponse();
+			response.setResponseName(getCommandName());
+			this.setResponseObject(response);
+		} catch (ServerException e) {
+			throw new ServerApiException(BaseCmd.INTERNAL_ERROR, e.toString());
+		} catch (InvalidParameterValueException e) {
+			throw new ServerApiException(BaseCmd.PARAM_ERROR, e.toString());
+		} catch (UnknownHostException e) {
+			throw new ServerApiException(BaseCmd.PARAM_ERROR, e.toString());
+		}
+		
+	}
+
+	@Override
+	public String getCommandName() {
+		// TODO Auto-generated method stub
+		return s_name;
+	}
+
+	@Override
+	public long getEntityOwnerId() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/CreateVolumePoolCmd.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/CreateVolumePoolCmd.java b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/CreateVolumePoolCmd.java
new file mode 100644
index 0000000..020493b
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/CreateVolumePoolCmd.java
@@ -0,0 +1,84 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.api.commands.netapp;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.api.ApiConstants;
+import com.cloud.api.BaseCmd;
+import com.cloud.api.Implementation;
+import com.cloud.api.Parameter;
+import com.cloud.api.ServerApiException;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.netapp.NetappManager;
+import com.cloud.server.ManagementService;
+import com.cloud.server.api.response.netapp.CreateVolumePoolCmdResponse;
+import com.cloud.utils.component.ComponentLocator;
+
+@Implementation(description="Create a pool", responseObject = CreateVolumePoolCmdResponse.class)
+public class CreateVolumePoolCmd extends BaseCmd {
+	public static final Logger s_logger = Logger.getLogger(CreateVolumePoolCmd.class.getName());
+    private static final String s_name = "createpoolresponse";
+
+    @Parameter(name=ApiConstants.NAME, type=CommandType.STRING, required = true, description="pool name.")
+	private String poolName;
+    @Parameter(name=ApiConstants.ALGORITHM, type=CommandType.STRING, required = true, description="algorithm.")
+	private String algorithm;
+    
+    public String getPoolName() {
+    	return poolName;
+    }
+    
+    public String getAlgorithm() {
+    	return algorithm;
+    }
+
+	@Override
+	public void execute() throws ResourceUnavailableException,
+			InsufficientCapacityException, ServerApiException,
+			ConcurrentOperationException, ResourceAllocationException {
+		ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
+    	NetappManager netappMgr = locator.getManager(NetappManager.class);
+    	
+    	try {
+    		CreateVolumePoolCmdResponse response = new CreateVolumePoolCmdResponse();
+    		netappMgr.createPool(getPoolName(), getAlgorithm());
+    		response.setResponseName(getCommandName());
+    		this.setResponseObject(response);
+    	} catch (InvalidParameterValueException e) {
+    		throw new ServerApiException(BaseCmd.INTERNAL_ERROR, e.toString());
+    	}
+		
+	}
+
+	@Override
+	public String getCommandName() {
+		// TODO Auto-generated method stub
+		return s_name;
+	}
+
+	@Override
+	public long getEntityOwnerId() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DeleteVolumePoolCmd.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DeleteVolumePoolCmd.java b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DeleteVolumePoolCmd.java
new file mode 100644
index 0000000..de12511
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DeleteVolumePoolCmd.java
@@ -0,0 +1,76 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.api.commands.netapp;
+
+
+import org.apache.log4j.Logger;
+
+import com.cloud.api.ApiConstants;
+import com.cloud.api.BaseCmd;
+import com.cloud.api.Implementation;
+import com.cloud.api.Parameter;
+import com.cloud.api.ServerApiException;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceInUseException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.netapp.NetappManager;
+import com.cloud.server.ManagementService;
+import com.cloud.server.api.response.netapp.DeleteVolumePoolCmdResponse;
+import com.cloud.utils.component.ComponentLocator;
+
+@Implementation(description="Delete a pool", responseObject = DeleteVolumePoolCmdResponse.class)
+public class DeleteVolumePoolCmd extends BaseCmd {
+	public static final Logger s_logger = Logger.getLogger(DeleteVolumePoolCmd.class.getName());
+    private static final String s_name = "deletepoolresponse";
+    
+    @Parameter(name=ApiConstants.POOL_NAME, type=CommandType.STRING, required = true, description="pool name.")
+	private String poolName;
+
+	@Override
+	public void execute() throws ResourceUnavailableException,
+			InsufficientCapacityException, ServerApiException,
+			ConcurrentOperationException, ResourceAllocationException {
+		ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
+    	NetappManager netappMgr = locator.getManager(NetappManager.class);
+    	try {
+			netappMgr.deletePool(poolName);
+			DeleteVolumePoolCmdResponse response = new DeleteVolumePoolCmdResponse();
+			response.setResponseName(getCommandName());
+			this.setResponseObject(response);
+		} catch (InvalidParameterValueException e) {
+			throw new ServerApiException(BaseCmd.PARAM_ERROR, e.toString());
+		} catch (ResourceInUseException e) {
+			throw new ServerApiException(BaseCmd.RESOURCE_IN_USE_ERROR, e.toString());
+		}
+	}
+
+	@Override
+	public String getCommandName() {
+		// TODO Auto-generated method stub
+		return s_name;
+	}
+
+	@Override
+	public long getEntityOwnerId() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DestroyLunCmd.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DestroyLunCmd.java b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DestroyLunCmd.java
new file mode 100644
index 0000000..76ccd0e
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DestroyLunCmd.java
@@ -0,0 +1,78 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.api.commands.netapp;
+
+import java.rmi.ServerException;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.api.ApiConstants;
+import com.cloud.api.BaseCmd;
+import com.cloud.api.Implementation;
+import com.cloud.api.Parameter;
+import com.cloud.api.ServerApiException;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceInUseException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.netapp.NetappManager;
+import com.cloud.server.ManagementService;
+import com.cloud.server.api.response.netapp.DeleteLUNCmdResponse;
+import com.cloud.utils.component.ComponentLocator;
+
+@Implementation(description="Destroy a LUN", responseObject = DeleteLUNCmdResponse.class)
+public class DestroyLunCmd extends BaseCmd {
+    
+	public static final Logger s_logger = Logger.getLogger(DestroyLunCmd.class.getName());
+    private static final String s_name = "destroylunresponse";
+
+    @Parameter(name=ApiConstants.PATH, type=CommandType.STRING, required = true, description="LUN path.")
+	private String path;
+
+    @Override
+    public void execute() throws ResourceUnavailableException,
+    InsufficientCapacityException, ServerApiException,
+    ConcurrentOperationException, ResourceAllocationException {
+    	ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
+    	NetappManager netappMgr = locator.getManager(NetappManager.class);
+    	try {
+			netappMgr.destroyLunOnFiler(path);
+    		DeleteLUNCmdResponse response = new DeleteLUNCmdResponse();
+    		response.setResponseName(getCommandName());
+    		this.setResponseObject(response);
+    	} catch (InvalidParameterValueException e) {
+    		throw new ServerApiException(BaseCmd.PARAM_ERROR, e.toString());
+    	} catch (ServerException e) {
+    		throw new ServerApiException(BaseCmd.RESOURCE_IN_USE_ERROR, e.toString());
+    	}
+    }
+
+    @Override
+	public String getCommandName() {
+		// TODO Auto-generated method stub
+		return s_name;
+	}
+
+	@Override
+	public long getEntityOwnerId() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DestroyVolumeOnFilerCmd.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DestroyVolumeOnFilerCmd.java b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DestroyVolumeOnFilerCmd.java
new file mode 100644
index 0000000..4bde7f5
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DestroyVolumeOnFilerCmd.java
@@ -0,0 +1,87 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.api.commands.netapp;
+
+import java.rmi.ServerException;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.api.ApiConstants;
+import com.cloud.api.BaseCmd;
+import com.cloud.api.Implementation;
+import com.cloud.api.Parameter;
+import com.cloud.api.ServerApiException;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceInUseException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.netapp.NetappManager;
+import com.cloud.server.ManagementService;
+import com.cloud.server.api.response.netapp.DeleteVolumeOnFilerCmdResponse;
+import com.cloud.utils.component.ComponentLocator;
+
+@Implementation(description="Destroy a Volume", responseObject = DeleteVolumeOnFilerCmdResponse.class)
+public class DestroyVolumeOnFilerCmd extends BaseCmd {
+	public static final Logger s_logger = Logger.getLogger(DestroyVolumeOnFilerCmd.class.getName());
+    private static final String s_name = "destroyvolumeresponse";
+    
+    @Parameter(name=ApiConstants.AGGREGATE_NAME, type=CommandType.STRING, required = true, description="aggregate name.")
+	private String aggrName;
+    
+    @Parameter(name=ApiConstants.IP_ADDRESS, type=CommandType.STRING, required = true, description="ip address.")
+	private String ipAddr;
+    
+    @Parameter(name=ApiConstants.VOLUME_NAME, type=CommandType.STRING, required = true, description="volume name.")
+	private String volumeName;
+    
+    
+	@Override
+	public void execute() throws ResourceUnavailableException,
+			InsufficientCapacityException, ServerApiException,
+			ConcurrentOperationException, ResourceAllocationException {
+		ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
+    	NetappManager netappMgr = locator.getManager(NetappManager.class);
+    	try {
+    		netappMgr.destroyVolumeOnFiler(ipAddr, aggrName, volumeName);
+    		DeleteVolumeOnFilerCmdResponse response = new DeleteVolumeOnFilerCmdResponse();
+    		response.setResponseName(getCommandName());
+    		this.setResponseObject(response);
+    	} catch (InvalidParameterValueException e) {
+    		throw new ServerApiException(BaseCmd.PARAM_ERROR, e.toString());
+    	} catch (ResourceInUseException e) {
+    		throw new ServerApiException(BaseCmd.RESOURCE_IN_USE_ERROR, e.toString());
+    	} catch (ServerException e) {
+    		throw new ServerApiException(BaseCmd.INTERNAL_ERROR, e.toString());
+		}
+		
+	}
+
+	@Override
+	public String getCommandName() {
+		// TODO Auto-generated method stub
+		return s_name;
+	}
+
+	@Override
+	public long getEntityOwnerId() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+    
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DissociateLunCmd.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DissociateLunCmd.java b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DissociateLunCmd.java
new file mode 100644
index 0000000..77425cb
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/DissociateLunCmd.java
@@ -0,0 +1,79 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.api.commands.netapp;
+
+import java.rmi.ServerException;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.api.ApiConstants;
+import com.cloud.api.BaseCmd;
+import com.cloud.api.Implementation;
+import com.cloud.api.Parameter;
+import com.cloud.api.ServerApiException;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.netapp.NetappManager;
+import com.cloud.server.ManagementService;
+import com.cloud.server.api.response.netapp.DissociateLunCmdResponse;
+import com.cloud.utils.component.ComponentLocator;
+
+@Implementation(description="Dissociate a LUN", responseObject = DissociateLunCmdResponse.class)
+public class DissociateLunCmd extends BaseCmd {
+	public static final Logger s_logger = Logger.getLogger(DissociateLunCmd.class.getName());
+    private static final String s_name = "dissociatelunresponse";
+
+    @Parameter(name=ApiConstants.PATH, type=CommandType.STRING, required = true, description="LUN path.")
+	private String path;
+    
+    @Parameter(name=ApiConstants.IQN, type=CommandType.STRING, required = true, description="Guest IQN.")
+	private String guestIQN;
+    
+	@Override
+	public void execute() throws ResourceUnavailableException,
+			InsufficientCapacityException, ServerApiException,
+			ConcurrentOperationException, ResourceAllocationException {
+		ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
+    	NetappManager netappMgr = locator.getManager(NetappManager.class);
+    	try {
+    		netappMgr.disassociateLun(guestIQN, path);
+    		DissociateLunCmdResponse response = new DissociateLunCmdResponse();
+    		response.setResponseName(getCommandName());
+    		this.setResponseObject(response);
+    	} catch (InvalidParameterValueException e) {
+    		throw new ServerApiException(BaseCmd.PARAM_ERROR, e.toString());
+    	} catch (ServerException e) {
+    		throw new ServerApiException(BaseCmd.INTERNAL_ERROR, e.toString());
+		}
+	}
+
+	@Override
+	public String getCommandName() {
+		// TODO Auto-generated method stub
+		return s_name;
+	}
+
+	@Override
+	public long getEntityOwnerId() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ListLunsCmd.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ListLunsCmd.java b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ListLunsCmd.java
new file mode 100644
index 0000000..1101648
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ListLunsCmd.java
@@ -0,0 +1,88 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.api.commands.netapp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.api.ApiConstants;
+import com.cloud.api.BaseCmd;
+import com.cloud.api.Implementation;
+import com.cloud.api.Parameter;
+import com.cloud.api.ServerApiException;
+import com.cloud.api.response.ListResponse;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.netapp.LunVO;
+import com.cloud.netapp.NetappManager;
+import com.cloud.server.ManagementService;
+import com.cloud.server.api.response.netapp.ListLunsCmdResponse;
+import com.cloud.utils.component.ComponentLocator;
+
+@Implementation(description="List LUN", responseObject = ListLunsCmdResponse.class)
+public class ListLunsCmd extends BaseCmd 
+{
+	public static final Logger s_logger = Logger.getLogger(ListLunsCmd.class.getName());
+    private static final String s_name = "listlunresponse";
+
+    @Parameter(name=ApiConstants.POOL_NAME, type=CommandType.STRING, required = true, description="pool name.")
+	private String poolName;
+
+	@Override
+	public void execute() throws ResourceUnavailableException,
+			InsufficientCapacityException, ServerApiException,
+			ConcurrentOperationException, ResourceAllocationException {
+		ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
+    	NetappManager netappMgr = locator.getManager(NetappManager.class);
+    	try {
+    		List<LunVO> lunList = netappMgr.listLunsOnFiler(poolName);
+    		ListResponse<ListLunsCmdResponse> listResponse = new ListResponse<ListLunsCmdResponse>();
+    		List<ListLunsCmdResponse> responses = new ArrayList<ListLunsCmdResponse>();
+    		for (LunVO lun : lunList) {
+    			ListLunsCmdResponse response = new ListLunsCmdResponse();
+    			response.setId(lun.getId());
+    			response.setIqn(lun.getTargetIqn());
+    			response.setName(lun.getLunName());
+    			response.setVolumeId(lun.getVolumeId());
+    			response.setObjectName("lun");
+    			responses.add(response);
+    		}
+    		listResponse.setResponses(responses);
+    		listResponse.setResponseName(getCommandName());
+    		this.setResponseObject(listResponse);
+    	} catch (InvalidParameterValueException e) {
+    		throw new ServerApiException(BaseCmd.PARAM_ERROR, e.toString());
+    	}		
+	}
+
+	@Override
+	public String getCommandName() {
+		// TODO Auto-generated method stub
+		return s_name;
+	}
+
+	@Override
+	public long getEntityOwnerId() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ListVolumePoolsCmd.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ListVolumePoolsCmd.java b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ListVolumePoolsCmd.java
new file mode 100644
index 0000000..e646739
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ListVolumePoolsCmd.java
@@ -0,0 +1,84 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.api.commands.netapp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.api.BaseCmd;
+import com.cloud.api.Implementation;
+import com.cloud.api.ServerApiException;
+import com.cloud.api.response.ListResponse;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.netapp.NetappManager;
+import com.cloud.netapp.PoolVO;
+import com.cloud.server.ManagementService;
+import com.cloud.server.api.response.netapp.ListVolumePoolsCmdResponse;
+import com.cloud.utils.component.ComponentLocator;
+
+@Implementation(description="List Pool", responseObject = ListVolumePoolsCmdResponse.class)
+public class ListVolumePoolsCmd extends BaseCmd {
+	public static final Logger s_logger = Logger.getLogger(ListVolumePoolsCmd.class.getName());
+    private static final String s_name = "listpoolresponse";
+
+
+	@Override
+	public void execute() throws ResourceUnavailableException,
+			InsufficientCapacityException, ServerApiException,
+			ConcurrentOperationException, ResourceAllocationException {
+		ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
+    	NetappManager netappMgr = locator.getManager(NetappManager.class);
+    	try {
+    		List<PoolVO> poolList = netappMgr.listPools();
+    		ListResponse<ListVolumePoolsCmdResponse> listResponse = new ListResponse<ListVolumePoolsCmdResponse>();
+    		List<ListVolumePoolsCmdResponse> responses = new ArrayList<ListVolumePoolsCmdResponse>();
+    		for (PoolVO pool : poolList) {
+    			ListVolumePoolsCmdResponse response = new ListVolumePoolsCmdResponse();
+    			response.setId(pool.getId());
+    			response.setName(pool.getName());
+    			response.setAlgorithm(pool.getAlgorithm());
+    			response.setObjectName("pool");
+    			responses.add(response);
+    		}
+    		listResponse.setResponses(responses);
+    		listResponse.setResponseName(getCommandName());
+    		this.setResponseObject(listResponse);
+    	} catch (InvalidParameterValueException e) {
+    		throw new ServerApiException(BaseCmd.PARAM_ERROR, e.toString());
+    	}		
+		
+	}
+
+	@Override
+	public String getCommandName() {
+		// TODO Auto-generated method stub
+		return s_name;
+	}
+
+	@Override
+	public long getEntityOwnerId() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ListVolumesOnFilerCmd.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ListVolumesOnFilerCmd.java b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ListVolumesOnFilerCmd.java
new file mode 100644
index 0000000..389053a
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ListVolumesOnFilerCmd.java
@@ -0,0 +1,94 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.api.commands.netapp;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.api.ApiConstants;
+import com.cloud.api.BaseCmd;
+import com.cloud.api.Implementation;
+import com.cloud.api.Parameter;
+import com.cloud.api.ServerApiException;
+import com.cloud.api.response.ListResponse;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.netapp.NetappManager;
+import com.cloud.netapp.NetappVolumeVO;
+import com.cloud.server.ManagementService;
+import com.cloud.server.api.response.netapp.ListVolumesOnFilerCmdResponse;
+import com.cloud.utils.component.ComponentLocator;
+
+@Implementation(description="List Volumes", responseObject = ListVolumesOnFilerCmdResponse.class)
+public class ListVolumesOnFilerCmd extends BaseCmd {
+	public static final Logger s_logger = Logger.getLogger(ListVolumesOnFilerCmd.class.getName());
+    private static final String s_name = "listvolumesresponse";
+    
+    @Parameter(name=ApiConstants.POOL_NAME, type=CommandType.STRING, required = true, description="pool name.")
+	private String poolName;
+
+	@Override
+	public void execute() throws ResourceUnavailableException,
+			InsufficientCapacityException, ServerApiException,
+			ConcurrentOperationException, ResourceAllocationException {
+		ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
+    	NetappManager netappMgr = locator.getManager(NetappManager.class);
+    	
+    	try {
+    		List<NetappVolumeVO> volumes = netappMgr.listVolumesOnFiler(poolName);
+    		ListResponse<ListVolumesOnFilerCmdResponse> listResponse = new ListResponse<ListVolumesOnFilerCmdResponse>();
+    		List<ListVolumesOnFilerCmdResponse> responses = new ArrayList<ListVolumesOnFilerCmdResponse>();
+    		for (NetappVolumeVO volume : volumes) {
+    			ListVolumesOnFilerCmdResponse response = new ListVolumesOnFilerCmdResponse();
+    			response.setId(volume.getId());
+    			response.setIpAddress(volume.getIpAddress());
+    			response.setPoolName(volume.getPoolName());
+    			response.setAggrName(volume.getAggregateName());
+    			response.setVolumeName(volume.getVolumeName());
+    			response.setSnapshotPolicy(volume.getSnapshotPolicy());
+    			response.setSnapshotReservation(volume.getSnapshotReservation());
+    			response.setVolumeSize(volume.getVolumeSize());
+    			response.setObjectName("volume");
+    			responses.add(response);
+    		}
+    		listResponse.setResponses(responses);
+    		listResponse.setResponseName(getCommandName());
+    		this.setResponseObject(listResponse);
+    	} catch (InvalidParameterValueException e) {
+    		throw new ServerApiException(BaseCmd.INTERNAL_ERROR, e.toString());
+    	}
+		
+	}
+
+	@Override
+	public String getCommandName() {
+		// TODO Auto-generated method stub
+		return s_name;
+	}
+
+	@Override
+	public long getEntityOwnerId() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ModifyVolumePoolCmd.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ModifyVolumePoolCmd.java b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ModifyVolumePoolCmd.java
new file mode 100644
index 0000000..0bca290
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/api/commands/netapp/ModifyVolumePoolCmd.java
@@ -0,0 +1,73 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.api.commands.netapp;
+
+
+import org.apache.log4j.Logger;
+
+import com.cloud.api.ApiConstants;
+import com.cloud.api.BaseCmd;
+import com.cloud.api.Implementation;
+import com.cloud.api.Parameter;
+import com.cloud.api.ServerApiException;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.ResourceAllocationException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.netapp.NetappManager;
+import com.cloud.server.ManagementService;
+import com.cloud.server.api.response.netapp.ModifyVolumePoolCmdResponse;
+import com.cloud.utils.component.ComponentLocator;
+
+@Implementation(description="Modify pool", responseObject = ModifyVolumePoolCmdResponse.class)
+public class ModifyVolumePoolCmd extends BaseCmd {
+	public static final Logger s_logger = Logger.getLogger(ModifyVolumePoolCmd.class.getName());
+    private static final String s_name = "modifypoolresponse";
+
+    @Parameter(name=ApiConstants.POOL_NAME, type=CommandType.STRING, required = true, description="pool name.")
+	private String poolName;
+
+    @Parameter(name=ApiConstants.ALGORITHM, type=CommandType.STRING, required = true, description="algorithm.")
+	private String algorithm;
+
+    @Override
+    public void execute() throws ResourceUnavailableException,
+    InsufficientCapacityException, ServerApiException,
+    ConcurrentOperationException, ResourceAllocationException {
+    	ComponentLocator locator = ComponentLocator.getLocator(ManagementService.Name);
+    	NetappManager netappMgr = locator.getManager(NetappManager.class);
+
+    	netappMgr.modifyPool(poolName, algorithm);
+
+    	ModifyVolumePoolCmdResponse response = new ModifyVolumePoolCmdResponse();
+    	response.setResponseName(getCommandName());
+    	this.setResponseObject(response);
+    }
+
+    @Override
+	public String getCommandName() {
+		// TODO Auto-generated method stub
+		return s_name;
+	}
+
+	@Override
+	public long getEntityOwnerId() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/netapp/LunVO.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/netapp/LunVO.java b/plugins/file-systems/netapp/src/com/cloud/netapp/LunVO.java
new file mode 100644
index 0000000..af2e575
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/netapp/LunVO.java
@@ -0,0 +1,121 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.netapp;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name="netapp_lun")
+public class LunVO {
+		
+	@Id
+    @GeneratedValue(strategy=GenerationType.IDENTITY)
+    @Column(name="id")
+    private Long id;
+	
+	@Column(name="lun_name")
+    private String lunName;
+
+	@Column(name="target_iqn")
+    private String targetIqn;
+	
+    @Column(name="path")
+	private String path;
+
+    @Column(name="volume_id")
+	private Long volumeId;
+
+    public Long getSize() {
+		return size;
+	}
+
+	public void setSize(Long size) {
+		this.size = size;
+	}
+
+
+	@Column(name="size")
+	private Long size;
+
+	public LunVO(){
+		
+	}
+	
+	public LunVO(String path, Long volumeId, Long size, String lunName, String targetIqn) {
+		this.path = path;
+		this.volumeId = volumeId;
+		this.size = size;
+		this.lunName = lunName;
+		this.targetIqn = targetIqn;
+	}
+	
+	public String getLunName() {
+		return lunName;
+	}
+
+	public void setLunName(String lunName) {
+		this.lunName = lunName;
+	}
+
+	public LunVO(Long id, String path, Long volumeId, Long size, String lunName, String targetIqn) {
+		this.id = id;
+		this.path = path;
+		this.volumeId = volumeId;
+		this.size = size;
+		this.lunName = lunName;
+		this.targetIqn = targetIqn;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getPath() {
+		return path;
+	}
+
+	public void setPath(String path) {
+		this.path = path;
+	}
+
+	public Long getVolumeId() {
+		return volumeId;
+	}
+
+	public void setVolumeId(Long volumeId) {
+		this.volumeId = volumeId;
+	}
+	
+	public void setTargetIqn(String iqn){
+		this.targetIqn = iqn;
+	}
+	
+	public String getTargetIqn(){
+		return targetIqn;
+	}
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/netapp/NetappAllocator.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/netapp/NetappAllocator.java b/plugins/file-systems/netapp/src/com/cloud/netapp/NetappAllocator.java
new file mode 100644
index 0000000..0cc3629
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/netapp/NetappAllocator.java
@@ -0,0 +1,25 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.netapp;
+
+
+public interface NetappAllocator{
+
+	public NetappVolumeVO chooseVolumeFromPool(String poolName, long lunSizeGb) ;
+
+	public NetappVolumeVO chooseLeastFullVolumeFromPool(String poolName,long lunSizeGb);
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/netapp/NetappDefaultAllocatorImpl.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/netapp/NetappDefaultAllocatorImpl.java b/plugins/file-systems/netapp/src/com/cloud/netapp/NetappDefaultAllocatorImpl.java
new file mode 100644
index 0000000..3692983
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/netapp/NetappDefaultAllocatorImpl.java
@@ -0,0 +1,142 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+package com.cloud.netapp;
+
+import java.io.IOException;
+import java.rmi.ServerException;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import netapp.manage.NaException;
+
+public class NetappDefaultAllocatorImpl implements NetappAllocator
+{
+	private static HashMap<String, Integer> _poolNameToLastVolumeIdAllocated = new HashMap<String, Integer>();
+	private NetappManager _netappMgr;
+    public static final Logger s_logger = Logger.getLogger(NetappDefaultAllocatorImpl.class.getName());
+	
+	public NetappDefaultAllocatorImpl(NetappManager netappMgr) {
+		_netappMgr = netappMgr;
+	}
+	
+	public synchronized NetappVolumeVO chooseLeastFullVolumeFromPool(String poolName, long lunSizeGb) 
+	{
+		List<NetappVolumeVO> volumesOnPoolAscending = _netappMgr.listVolumesAscending(poolName);
+		
+		if(volumesOnPoolAscending==null)
+		{
+			//no pools exist in db
+			return null;
+		}
+		
+		long maxAvailable = 0;
+		NetappVolumeVO selectedVol = null;
+		for(NetappVolumeVO vol : volumesOnPoolAscending)
+		{
+			try {
+				long availableBytes = _netappMgr.returnAvailableVolumeSize(vol.getVolumeName(), vol.getUsername(), vol.getPassword(), vol.getIpAddress());
+
+				if(lunSizeGb <= bytesToGb(availableBytes) && availableBytes>maxAvailable)
+				{
+					maxAvailable = availableBytes; //new max
+					selectedVol = vol; //new least loaded vol
+				}
+			} catch (ServerException se) {
+				s_logger.debug("Ignoring failure to obtain volume size for volume " + vol.getVolumeName());
+				continue;	
+			}
+		}
+		
+		return selectedVol;
+	}
+	
+	/**
+	 * This method does the actual round robin allocation
+	 * @param poolName 
+	 * @param lunSizeGb
+	 * @return -- the selected volume to create the lun on
+	 * @throws IOException
+	 * @throws NaException
+	 */
+	public synchronized NetappVolumeVO chooseVolumeFromPool(String poolName, long lunSizeGb)
+	{
+		int pos = 0; //0 by default
+		List<NetappVolumeVO> volumesOnPoolAscending = _netappMgr.listVolumesAscending(poolName);
+		
+		if(volumesOnPoolAscending==null)
+		{
+			//no pools exist in db
+			return null;
+		}
+		
+		//get the index of the record from the map
+		if(_poolNameToLastVolumeIdAllocated.get(poolName)==null)
+		{
+			pos=0;
+		}
+		else
+		{
+			pos=_poolNameToLastVolumeIdAllocated.get(poolName);
+		}
+		
+		//update for RR effect
+		_poolNameToLastVolumeIdAllocated.put(poolName, (pos+1)%volumesOnPoolAscending.size());
+		
+		//now iterate over the records
+		Object[] volumesOnPoolAscendingArray = volumesOnPoolAscending.toArray();
+		int counter=0;
+		while (counter < volumesOnPoolAscendingArray.length)
+		{
+			NetappVolumeVO vol = (NetappVolumeVO)volumesOnPoolAscendingArray[pos];
+			
+			//check if the volume fits the bill
+			long availableBytes;
+			try {
+				availableBytes = _netappMgr.returnAvailableVolumeSize(vol.getVolumeName(), vol.getUsername(), vol.getPassword(), vol.getIpAddress());
+									
+				if(lunSizeGb <= bytesToGb(availableBytes))
+				{
+					//found one
+					return vol;
+				}
+				pos = (pos + 1) % volumesOnPoolAscendingArray.length;
+				counter++;
+			} catch (ServerException e) {
+				s_logger.debug("Ignoring failure to obtain volume size for volume " + vol.getVolumeName());
+				continue;
+			}
+		}
+		
+		return null;
+	}
+	
+	
+	/**
+	 * This method does the byte to gb conversion
+	 * @param bytes 
+	 * @return -- converted gb
+	 */
+	private long bytesToGb(long bytes){
+		long returnVal = (bytes/(1024*1024*1024));
+		return returnVal;
+	}
+
+}
+
+	 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/8aa2b55d/plugins/file-systems/netapp/src/com/cloud/netapp/NetappManager.java
----------------------------------------------------------------------
diff --git a/plugins/file-systems/netapp/src/com/cloud/netapp/NetappManager.java b/plugins/file-systems/netapp/src/com/cloud/netapp/NetappManager.java
new file mode 100644
index 0000000..7216c50
--- /dev/null
+++ b/plugins/file-systems/netapp/src/com/cloud/netapp/NetappManager.java
@@ -0,0 +1,66 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+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;
+
+}