You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by mt...@apache.org on 2015/10/14 20:09:46 UTC

[6/7] git commit: updated refs/heads/sf-plugins-a to 49ca3b4

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/api/command/user/solidfire/ListSolidFireVirtualNetworksCmd.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/api/command/user/solidfire/ListSolidFireVirtualNetworksCmd.java b/plugins/api/solidfire/src/org/apache/cloudstack/api/command/user/solidfire/ListSolidFireVirtualNetworksCmd.java
new file mode 100644
index 0000000..c5ac3bf
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/api/command/user/solidfire/ListSolidFireVirtualNetworksCmd.java
@@ -0,0 +1,114 @@
+// 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 org.apache.cloudstack.api.command.user.solidfire;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseListCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.ResponseObject.ResponseView;
+import org.apache.cloudstack.api.response.AccountResponse;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.ZoneResponse;
+import org.apache.cloudstack.api.response.solidfire.ApiSolidFireVirtualNetworkResponse;
+import org.apache.cloudstack.api.solidfire.SfApiConstants;
+import org.apache.cloudstack.solidfire.SfVirtualNetwork;
+import org.apache.cloudstack.solidfire.SolidFireManager;
+import org.apache.cloudstack.util.solidfire.SfUtil;
+
+@APICommand(name = "listSolidFireVirtualNetworks", responseObject = ApiSolidFireVirtualNetworkResponse.class, description = "List SolidFire Virtual Networks",
+    requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+public class ListSolidFireVirtualNetworksCmd extends BaseListCmd {
+    private static final Logger s_logger = Logger.getLogger(ListSolidFireVirtualNetworksCmd.class.getName());
+    private static final String s_name = "listsolidfirevirtualnetworksresponse";
+
+    @Inject private SolidFireManager _solidFireManager;
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ApiSolidFireVirtualNetworkResponse.class, description = SfApiConstants.VIRTUAL_NETWORK_ID_DESC)
+    private Long _id;
+
+    @Parameter(name = SfApiConstants.CLUSTER_NAME, type = CommandType.STRING, description = SfApiConstants.SOLIDFIRE_CLUSTER_NAME_DESC)
+    private String _clusterName;
+
+    @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = SfApiConstants.ZONE_ID_DESC)
+    private Long _zoneId;
+
+    @Parameter(name = ApiConstants.ACCOUNT_ID, type = CommandType.UUID, entityType = AccountResponse.class, description = SfApiConstants.ACCOUNT_ID_DESC)
+    private Long _accountId;
+
+    @Inject private SfUtil _sfUtil;
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public void execute() {
+        try {
+            s_logger.info(ListSolidFireVirtualNetworksCmd.class.getName() + ".execute invoked");
+
+            final List<SfVirtualNetwork> sfVirtualNetworks;
+
+            if (_id != null) {
+                sfVirtualNetworks = new ArrayList<>();
+
+                SfVirtualNetwork sfVirtualNetwork = _solidFireManager.listSolidFireVirtualNetworkById(_id);
+
+                if (sfVirtualNetwork != null) {
+                    sfVirtualNetworks.add(sfVirtualNetwork);
+                }
+            }
+            else if (_clusterName != null) {
+                sfVirtualNetworks = _solidFireManager.listSolidFireVirtualNetworkByClusterName(_clusterName);
+            }
+            else {
+                sfVirtualNetworks = _solidFireManager.listSolidFireVirtualNetworks(_zoneId, _accountId);
+            }
+
+            ResponseView responseView = _sfUtil.isRootAdmin() ? ResponseView.Full : ResponseView.Restricted;
+
+            List<ApiSolidFireVirtualNetworkResponse> responses = _sfUtil.getApiSolidFireVirtualNetworkResponse(sfVirtualNetworks, responseView);
+
+            ListResponse<ApiSolidFireVirtualNetworkResponse> listReponse = new ListResponse<>();
+
+            listReponse.setResponses(responses);
+            listReponse.setResponseName(getCommandName());
+            listReponse.setObjectName("apilistsolidfirevirtualnetworks");
+
+            setResponseObject(listReponse);
+        }
+        catch (Throwable t) {
+            s_logger.error(t.getMessage());
+
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, t.getMessage());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/api/command/user/solidfire/ListSolidFireVolumesCmd.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/api/command/user/solidfire/ListSolidFireVolumesCmd.java b/plugins/api/solidfire/src/org/apache/cloudstack/api/command/user/solidfire/ListSolidFireVolumesCmd.java
new file mode 100644
index 0000000..33bb758
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/api/command/user/solidfire/ListSolidFireVolumesCmd.java
@@ -0,0 +1,99 @@
+// 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 org.apache.cloudstack.api.command.user.solidfire;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseListCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.ResponseObject.ResponseView;
+import org.apache.cloudstack.api.response.ListResponse;
+import org.apache.cloudstack.api.response.solidfire.ApiSolidFireVolumeResponse;
+import org.apache.cloudstack.api.solidfire.SfApiConstants;
+import org.apache.cloudstack.solidfire.SfVolume;
+import org.apache.cloudstack.solidfire.SolidFireManager;
+import org.apache.cloudstack.util.solidfire.SfUtil;
+
+@APICommand(name = "listSolidFireVolumes", responseObject = ApiSolidFireVolumeResponse.class, description = "List SolidFire Volumes",
+    requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+public class ListSolidFireVolumesCmd extends BaseListCmd {
+    private static final Logger s_logger = Logger.getLogger(ListSolidFireVolumesCmd.class.getName());
+    private static final String s_name = "listsolidfirevolumesresponse";
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ApiSolidFireVolumeResponse.class, description = SfApiConstants.VOLUME_ID_DESC)
+    private Long _id;
+
+    @Inject private SolidFireManager _solidFireManager;
+    @Inject private SfUtil _sfUtil;
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public void execute() {
+        try {
+            s_logger.info(ListSolidFireVolumesCmd.class.getName() + ".execute invoked");
+
+            final List<SfVolume> sfVolumes;
+
+            if (_id != null) {
+                sfVolumes = new ArrayList<>();
+
+                SfVolume sfVolume = _solidFireManager.listSolidFireVolume(_id);
+
+                if (sfVolume != null) {
+                    sfVolumes.add(sfVolume);
+                }
+            }
+            else {
+                sfVolumes = _solidFireManager.listSolidFireVolumes();
+            }
+
+            ResponseView responseView = _sfUtil.isRootAdmin() ? ResponseView.Full : ResponseView.Restricted;
+
+            List<ApiSolidFireVolumeResponse> responses = _sfUtil.getApiSolidFireVolumeResponse(sfVolumes, responseView);
+
+            ListResponse<ApiSolidFireVolumeResponse> listReponse = new ListResponse<>();
+
+            listReponse.setResponses(responses);
+            listReponse.setResponseName(getCommandName());
+            listReponse.setObjectName("apilistsolidfirevolumes");
+
+            setResponseObject(listReponse);
+        }
+        catch (Throwable t) {
+            s_logger.error(t.getMessage());
+
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, t.getMessage());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/api/command/user/solidfire/UpdateSolidFireVolumeCmd.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/api/command/user/solidfire/UpdateSolidFireVolumeCmd.java b/plugins/api/solidfire/src/org/apache/cloudstack/api/command/user/solidfire/UpdateSolidFireVolumeCmd.java
new file mode 100644
index 0000000..6958619
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/api/command/user/solidfire/UpdateSolidFireVolumeCmd.java
@@ -0,0 +1,108 @@
+// 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 org.apache.cloudstack.api.command.user.solidfire;
+
+import com.cloud.user.Account;
+
+import javax.inject.Inject;
+
+import org.apache.log4j.Logger;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.api.BaseCmd;
+import org.apache.cloudstack.api.Parameter;
+import org.apache.cloudstack.api.ServerApiException;
+import org.apache.cloudstack.api.ResponseObject.ResponseView;
+import org.apache.cloudstack.api.response.solidfire.ApiSolidFireVolumeResponse;
+import org.apache.cloudstack.api.solidfire.SfApiConstants;
+import org.apache.cloudstack.solidfire.SfVirtualNetwork;
+import org.apache.cloudstack.solidfire.SfVolume;
+import org.apache.cloudstack.solidfire.SolidFireManager;
+import org.apache.cloudstack.util.solidfire.SfUtil;
+
+@APICommand(name = "updateSolidFireVolume", responseObject = ApiSolidFireVolumeResponse.class, description = "Update SolidFire Volume",
+    requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+public class UpdateSolidFireVolumeCmd extends BaseCmd {
+    private static final Logger s_logger = Logger.getLogger(UpdateSolidFireVolumeCmd.class.getName());
+    private static final String s_name = "updatesolidfirevolumeresponse";
+
+    @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ApiSolidFireVolumeResponse.class, description = SfApiConstants.VOLUME_ID_DESC, required = true)
+    private long _id;
+
+    @Parameter(name = ApiConstants.SIZE, type = CommandType.LONG, description = SfApiConstants.SIZE_DESC, required = true)
+    private long _size;
+
+    @Parameter(name = ApiConstants.MIN_IOPS, type = CommandType.LONG, description = SfApiConstants.MIN_IOPS_DESC, required = true)
+    private long _minIops;
+
+    @Parameter(name = ApiConstants.MAX_IOPS, type = CommandType.LONG, description = SfApiConstants.MAX_IOPS_DESC, required = true)
+    private long _maxIops;
+
+    @Parameter(name = SfApiConstants.BURST_IOPS, type = CommandType.LONG, description = SfApiConstants.BURST_IOPS_DESC, required = true)
+    private long _burstIops;
+
+    @Inject private SolidFireManager _solidFireManager;
+    @Inject private SfUtil _sfUtil;
+
+    /////////////////////////////////////////////////////
+    /////////////// API Implementation///////////////////
+    /////////////////////////////////////////////////////
+
+    @Override
+    public String getCommandName() {
+        return s_name;
+    }
+
+    @Override
+    public long getEntityOwnerId() {
+        SfVolume sfVolume = _entityMgr.findById(SfVolume.class, _id);
+
+        if (sfVolume != null) {
+            SfVirtualNetwork sfVirtualNetwork = _entityMgr.findById(SfVirtualNetwork.class, sfVolume.getSfVirtualNetworkId());
+
+            if (sfVirtualNetwork != null) {
+                sfVirtualNetwork.getAccountId();
+            }
+        }
+        return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked
+    }
+
+    @Override
+    public void execute() {
+        try {
+            s_logger.info(UpdateSolidFireVolumeCmd.class.getName() + ".execute invoked");
+
+            SfVolume sfVolume = _solidFireManager.updateSolidFireVolume(_id, _size, _minIops, _maxIops, _burstIops);
+
+            ResponseView responseView = _sfUtil.isRootAdmin() ? ResponseView.Full : ResponseView.Restricted;
+
+            ApiSolidFireVolumeResponse response = _sfUtil.getApiSolidFireVolumeResponse(sfVolume, responseView);
+
+            response.setResponseName(getCommandName());
+            response.setObjectName("apiupdatesolidfirevolume");
+
+            setResponseObject(response);
+        }
+        catch (Throwable t) {
+            s_logger.error(t.getMessage());
+
+            throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, t.getMessage());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/api/response/solidfire/ApiSolidFireClusterResponse.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/api/response/solidfire/ApiSolidFireClusterResponse.java b/plugins/api/solidfire/src/org/apache/cloudstack/api/response/solidfire/ApiSolidFireClusterResponse.java
new file mode 100644
index 0000000..5c6c688
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/api/response/solidfire/ApiSolidFireClusterResponse.java
@@ -0,0 +1,161 @@
+// 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 org.apache.cloudstack.api.response.solidfire;
+
+import com.cloud.serializer.Param;
+
+import com.google.gson.annotations.SerializedName;
+
+import org.apache.cloudstack.api.BaseResponse;
+import org.apache.cloudstack.api.EntityReference;
+import org.apache.cloudstack.api.solidfire.SfApiConstants;
+import org.apache.cloudstack.solidfire.SfCluster;
+
+@EntityReference(value = SfCluster.class)
+public class ApiSolidFireClusterResponse extends BaseResponse {
+    @SerializedName("id")
+    @Param(description = "CloudStack ID")
+    private long _id;
+
+    @SerializedName("uuid")
+    @Param(description = "CloudStack UUID")
+    private String _uuid;
+
+    @SerializedName("name")
+    @Param(description = SfApiConstants.SOLIDFIRE_CLUSTER_NAME_DESC)
+    private String _name;
+
+    @SerializedName("mvip")
+    @Param(description = SfApiConstants.SOLIDFIRE_MVIP_DESC)
+    private String _mvip;
+
+    @SerializedName("username")
+    @Param(description = SfApiConstants.SOLIDFIRE_USERNAME_DESC)
+    private String _username;
+
+    @SerializedName("totalcapacity")
+    @Param(description = "SolidFire cluster total capacity for CloudStack (in GBs)")
+    private long _totalCapacity;
+
+    @SerializedName("totalminiops")
+    @Param(description = "SolidFire cluster total minimum IOPS for CloudStack")
+    private long _totalMinIops;
+
+    @SerializedName("totalmaxiops")
+    @Param(description = "SolidFire cluster total maximum IOPS for CloudStack")
+    private long _totalMaxIops;
+
+    @SerializedName("totalburstiops")
+    @Param(description = "SolidFire cluster total burst IOPS for CloudStack")
+    private long _totalBurstIops;
+
+    @SerializedName("zoneid")
+    @Param(description = "Zone ID that the SolidFire cluster is associated with")
+    private long _zoneId;
+
+    @SerializedName("zonename")
+    @Param(description = "Zone name that the SolidFire cluster is associated with")
+    private String _zoneName;
+
+    public void setId(long id) {
+        _id = id;
+    }
+
+    public long getId() {
+        return _id;
+    }
+
+    public void setUuid(String uuid) {
+        _uuid = uuid;
+    }
+
+    public String getUuid() {
+        return _uuid;
+    }
+
+    public void setName(String name) {
+        _name = name;
+    }
+
+    public String getName() {
+        return _name;
+    }
+
+    public void setMvip(String mvip) {
+        _mvip = mvip;
+    }
+
+    public String getMvip() {
+        return _mvip;
+    }
+
+    public void setUsername(String username) {
+        _username = username;
+    }
+
+    public String getUsername() {
+        return _username;
+    }
+
+    public void setTotalCapacity(long totalCapacity) {
+        _totalCapacity = totalCapacity;
+    }
+
+    public long getTotalCapacity() {
+        return _totalCapacity;
+    }
+
+    public void setTotalMinIops(long totalMinIops) {
+        _totalMinIops = totalMinIops;
+    }
+
+    public long getTotalMinIops() {
+        return _totalMinIops;
+    }
+
+    public void setTotalMaxIops(long totalMaxIops) {
+        _totalMaxIops = totalMaxIops;
+    }
+
+    public long getTotalMaxIops() {
+        return _totalMaxIops;
+    }
+
+    public void setTotalBurstIops(long totalBurstIops) {
+        _totalBurstIops = totalBurstIops;
+    }
+
+    public long getTotalBurstIops() {
+        return _totalBurstIops;
+    }
+
+    public void setZoneId(long zoneId) {
+        _zoneId = zoneId;
+    }
+
+    public long getZoneId() {
+        return _zoneId;
+    }
+
+    public void setZoneName(String zoneName) {
+        _zoneName = zoneName;
+    }
+
+    public String getZoneName() {
+        return _zoneName;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/api/response/solidfire/ApiSolidFireVirtualNetworkResponse.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/api/response/solidfire/ApiSolidFireVirtualNetworkResponse.java b/plugins/api/solidfire/src/org/apache/cloudstack/api/response/solidfire/ApiSolidFireVirtualNetworkResponse.java
new file mode 100644
index 0000000..b47cae0
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/api/response/solidfire/ApiSolidFireVirtualNetworkResponse.java
@@ -0,0 +1,209 @@
+// 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 org.apache.cloudstack.api.response.solidfire;
+
+import com.cloud.serializer.Param;
+
+import com.google.gson.annotations.SerializedName;
+
+import org.apache.cloudstack.api.BaseResponse;
+import org.apache.cloudstack.api.EntityReference;
+import org.apache.cloudstack.api.solidfire.SfApiConstants;
+import org.apache.cloudstack.solidfire.SfVirtualNetwork;
+
+@EntityReference(value = SfVirtualNetwork.class)
+public class ApiSolidFireVirtualNetworkResponse extends BaseResponse {
+    @SerializedName("id")
+    @Param(description = "CloudStack ID")
+    private long _id;
+
+    @SerializedName("uuid")
+    @Param(description = "CloudStack UUID")
+    private String _uuid;
+
+    @SerializedName("name")
+    @Param(description = SfApiConstants.VIRTUAL_NETWORK_NAME_DESC)
+    private String _name;
+
+    @SerializedName("tag")
+    @Param(description = SfApiConstants.VIRTUAL_NETWORK_TAG_DESC)
+    private String _tag;
+
+    @SerializedName("startip")
+    @Param(description = SfApiConstants.START_IP_ADDRESS_DESC)
+    private String _startIp;
+
+    @SerializedName("size")
+    @Param(description = SfApiConstants.SIZE_DESC)
+    private int _size;
+
+    @SerializedName("netmask")
+    @Param(description = SfApiConstants.NETMASK_DESC)
+    private String _netmask;
+
+    @SerializedName("svip")
+    @Param(description = SfApiConstants.SOLIDFIRE_SVIP_DESC)
+    private String _svip;
+
+    @SerializedName("accountid")
+    @Param(description = "ID of the account the VLAN is associated with")
+    private long _accountId;
+
+    @SerializedName("accountuuid")
+    @Param(description = "UUID of the account the VLAN is associated with")
+    private String _accountUuid;
+
+    @SerializedName("accountname")
+    @Param(description = "Name of the account the volume is associated with")
+    private String _accountName;
+
+    @SerializedName("zoneid")
+    @Param(description = "ID of the zone the VLAN is associated with")
+    private long _zoneId;
+
+    @SerializedName("zoneuuid")
+    @Param(description = "UUID of the zone the VLAN is associated with")
+    private String _zoneUuid;
+
+    @SerializedName("zonename")
+    @Param(description = "Name of the zone the volume is associated with")
+    private String _zoneName;
+
+    @SerializedName("clustername")
+    @Param(description = "Name of cluster the VLAN belongs to")
+    private String _clusterName;
+
+    public void setId(long id) {
+        _id = id;
+    }
+
+    public long getId() {
+        return _id;
+    }
+
+    public void setUuid(String uuid) {
+        _uuid = uuid;
+    }
+
+    public String getUuid() {
+        return _uuid;
+    }
+
+    public void setName(String name) {
+        _name = name;
+    }
+
+    public String getName() {
+        return _name;
+    }
+
+    public void setTag(String tag) {
+        _tag = tag;
+    }
+
+    public String getTag() {
+        return _tag;
+    }
+
+    public void setStartIp(String startIp) {
+        _startIp = startIp;
+    }
+
+    public String getStartIp() {
+        return _startIp;
+    }
+
+    public void setSize(int size) {
+        _size = size;
+    }
+
+    public int getSize() {
+        return _size;
+    }
+
+    public void setNetmask(String netmask) {
+        _netmask = netmask;
+    }
+
+    public String getNetmask() {
+        return _netmask;
+    }
+
+    public void setSvip(String svip) {
+        _svip = svip;
+    }
+
+    public String getSvip() {
+        return _svip;
+    }
+
+    public void setAccountId(long accountId) {
+        _accountId = accountId;
+    }
+
+    public long getAccountId() {
+        return _accountId;
+    }
+
+    public void setAccountUuid(String accountUuid) {
+        _accountUuid = accountUuid;
+    }
+
+    public String getAccountUuid() {
+        return _accountUuid;
+    }
+
+    public void setAccountName(String accountName) {
+        _accountName = accountName;
+    }
+
+    public String getAccountName() {
+        return _accountName;
+    }
+
+    public void setZoneId(long zoneId) {
+        _zoneId = zoneId;
+    }
+
+    public long getZoneId() {
+        return _zoneId;
+    }
+
+    public void setZoneUuid(String zoneUuid) {
+        _zoneUuid = zoneUuid;
+    }
+
+    public String getZoneUuid() {
+        return _zoneUuid;
+    }
+
+    public void setZoneName(String zoneName) {
+        _zoneName = zoneName;
+    }
+
+    public String getZoneName() {
+        return _zoneName;
+    }
+
+    public void setClusterName(String clusterName) {
+        _clusterName = clusterName;
+    }
+
+    public String getClusterName() {
+        return _clusterName;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/api/response/solidfire/ApiSolidFireVolumeResponse.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/api/response/solidfire/ApiSolidFireVolumeResponse.java b/plugins/api/solidfire/src/org/apache/cloudstack/api/response/solidfire/ApiSolidFireVolumeResponse.java
new file mode 100644
index 0000000..d6e6029
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/api/response/solidfire/ApiSolidFireVolumeResponse.java
@@ -0,0 +1,320 @@
+// 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 org.apache.cloudstack.api.response.solidfire;
+
+import java.util.Date;
+
+import com.cloud.serializer.Param;
+
+import com.google.gson.annotations.SerializedName;
+
+import org.apache.cloudstack.api.ApiConstants;
+import org.apache.cloudstack.api.BaseResponse;
+import org.apache.cloudstack.api.EntityReference;
+import org.apache.cloudstack.api.solidfire.SfApiConstants;
+import org.apache.cloudstack.solidfire.SfVolume;
+
+@EntityReference(value = SfVolume.class)
+public class ApiSolidFireVolumeResponse extends BaseResponse {
+    @SerializedName("id")
+    @Param(description = "CloudStack ID")
+    private long _id;
+
+    @SerializedName("uuid")
+    @Param(description = "CloudStack UUID")
+    private String _uuid;
+
+    @SerializedName("name")
+    @Param(description = SfApiConstants.VOLUME_NAME_DESC)
+    private String _name;
+
+    @SerializedName("iqn")
+    @Param(description = SfApiConstants.IQN_DESC)
+    private String _iqn;
+
+    @SerializedName("size")
+    @Param(description = SfApiConstants.SIZE_DESC)
+    private long _size;
+
+    @SerializedName("miniops")
+    @Param(description = SfApiConstants.MIN_IOPS_DESC)
+    private long _minIops;
+
+    @SerializedName("maxiops")
+    @Param(description = SfApiConstants.MAX_IOPS_DESC)
+    private long _maxIops;
+
+    @SerializedName("burstiops")
+    @Param(description = SfApiConstants.BURST_IOPS_DESC)
+    private long _burstIops;
+
+    @SerializedName("accountid")
+    @Param(description = "ID of the account the volume is associated with")
+    private long _accountId;
+
+    @SerializedName("accountuuid")
+    @Param(description = "UUID of the account the volume is associated with")
+    private String _accountUuid;
+
+    @SerializedName("accountname")
+    @Param(description = "Name of the account the volume is associated with")
+    private String _accountName;
+
+    @SerializedName("vlanid")
+    @Param(description = "ID of the VLAN the volume is associated with")
+    private long _vlanId;
+
+    @SerializedName("vlanuuid")
+    @Param(description = "UUID of the VLAN the volume is associated with")
+    private String _vlanUuid;
+
+    @SerializedName("vlanname")
+    @Param(description = "Name of the VLAN the volume is associated with")
+    private String _vlanName;
+
+    @SerializedName("zoneid")
+    @Param(description = "ID of the zone the volume is associated with")
+    private long _zoneId;
+
+    @SerializedName("zoneuuid")
+    @Param(description = "UUID of the zone the volume is associated with")
+    private String _zoneUuid;
+
+    @SerializedName("zonename")
+    @Param(description = "Name of the zone the volume is associated with")
+    private String _zoneName;
+
+    @SerializedName("clustername")
+    @Param(description = "Name of cluster the volume belongs to")
+    private String _clusterName;
+
+    @SerializedName("targetportal")
+    @Param(description = "Target portal")
+    private String _targetPortal;
+
+    @SerializedName("chapinitiatorusername")
+    @Param(description = "CHAP initiator username")
+    private String _chapInitiatorUsername;
+
+    @SerializedName("chapinitiatorsecret")
+    @Param(description = "CHAP initiator secret")
+    private String _chapInitiatorSecret;
+
+    @SerializedName("chaptargetusername")
+    @Param(description = "CHAP target username")
+    private String _chapTargetUsername;
+
+    @SerializedName("chaptargetsecret")
+    @Param(description = "CHAP target secret")
+    private String _chapTargetSecret;
+
+    @SerializedName(ApiConstants.CREATED)
+    @Param(description = "Date volume was created")
+    private Date _created;
+
+    public void setId(long id) {
+        _id = id;
+    }
+
+    public long getId() {
+        return _id;
+    }
+
+    public void setUuid(String uuid) {
+        _uuid = uuid;
+    }
+
+    public String getUuid() {
+        return _uuid;
+    }
+
+    public void setName(String name) {
+        _name = name;
+    }
+
+    public String getName() {
+        return _name;
+    }
+
+    public void setIqn(String iqn) {
+        _iqn = iqn;
+    }
+
+    public String getIqn() {
+        return _iqn;
+    }
+
+    public void setSize(long size) {
+        _size = size;
+    }
+
+    public long getSize() {
+        return _size;
+    }
+
+    public void setMinIops(long minIops) {
+        _minIops = minIops;
+    }
+
+    public long getMinIops() {
+        return _minIops;
+    }
+
+    public void setMaxIops(long maxIops) {
+        _maxIops = maxIops;
+    }
+
+    public long getMaxIops() {
+        return _maxIops;
+    }
+
+    public void setBurstIops(long burstIops) {
+        _burstIops = burstIops;
+    }
+
+    public long getBurstIops() {
+        return _burstIops;
+    }
+
+    public void setAccountId(long accountId) {
+        _accountId = accountId;
+    }
+
+    public long getAccountId() {
+        return _accountId;
+    }
+
+    public void setAccountUuid(String accountUuid) {
+        _accountUuid = accountUuid;
+    }
+
+    public String getAccountUuid() {
+        return _accountUuid;
+    }
+
+    public void setAccountName(String accountName) {
+        _accountName = accountName;
+    }
+
+    public String getAccountName() {
+        return _accountName;
+    }
+
+    public void setVlanId(long vlanId) {
+        _vlanId = vlanId;
+    }
+
+    public long getVlanId() {
+        return _vlanId;
+    }
+
+    public void setVlanUuid(String vlanUuid) {
+        _vlanUuid = vlanUuid;
+    }
+
+    public String getVlanUuid() {
+        return _vlanUuid;
+    }
+
+    public void setVlanName(String vlanName) {
+        _vlanName = vlanName;
+    }
+
+    public String getVlanName() {
+        return _vlanName;
+    }
+
+    public void setZoneId(long zoneId) {
+        _zoneId = zoneId;
+    }
+
+    public long getZoneId() {
+        return _zoneId;
+    }
+
+    public void setZoneUuid(String zoneUuid) {
+        _zoneUuid = zoneUuid;
+    }
+
+    public String getZoneUuid() {
+        return _zoneUuid;
+    }
+
+    public void setZoneName(String zoneName) {
+        _zoneName = zoneName;
+    }
+
+    public String getZoneName() {
+        return _zoneName;
+    }
+
+    public void setClusterName(String clusterName) {
+        _clusterName = clusterName;
+    }
+
+    public String getClusterName() {
+        return _clusterName;
+    }
+
+    public void setTargetPortal(String targetPortal) {
+        _targetPortal = targetPortal;
+    }
+
+    public String getTargetPortal() {
+        return _targetPortal;
+    }
+
+    public void setChapInitiatorUsername(String chapInitiatorUsername) {
+        _chapInitiatorUsername = chapInitiatorUsername;
+    }
+
+    public String getChapInitiatorUsername() {
+        return _chapInitiatorUsername;
+    }
+
+    public void setChapInitiatorSecret(String chapInitiatorSecret) {
+        _chapInitiatorSecret = chapInitiatorSecret;
+    }
+
+    public String getChapInitiatorSecret() {
+        return _chapInitiatorSecret;
+    }
+
+    public void setChapTargetUsername(String chapTargetUsername) {
+        _chapTargetUsername = chapTargetUsername;
+    }
+
+    public String getTargetInitiatorUsername() {
+        return _chapTargetUsername;
+    }
+
+    public void setChapTargetSecret(String chapTargetSecret) {
+        _chapTargetSecret = chapTargetSecret;
+    }
+
+    public String getTargetInitiatorSecret() {
+        return _chapTargetSecret;
+    }
+
+    public void setCreated(Date created) {
+        _created = created;
+    }
+
+    public Date getCreated() {
+        return _created;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/api/solidfire/ApiSolidFireService.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/api/solidfire/ApiSolidFireService.java b/plugins/api/solidfire/src/org/apache/cloudstack/api/solidfire/ApiSolidFireService.java
new file mode 100644
index 0000000..5715c01
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/api/solidfire/ApiSolidFireService.java
@@ -0,0 +1,6 @@
+package org.apache.cloudstack.api.solidfire;
+
+import com.cloud.utils.component.PluggableService;
+
+public interface ApiSolidFireService extends PluggableService {
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/api/solidfire/ApiSolidFireServiceImpl.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/api/solidfire/ApiSolidFireServiceImpl.java b/plugins/api/solidfire/src/org/apache/cloudstack/api/solidfire/ApiSolidFireServiceImpl.java
new file mode 100644
index 0000000..9d33fcf
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/api/solidfire/ApiSolidFireServiceImpl.java
@@ -0,0 +1,45 @@
+package org.apache.cloudstack.api.solidfire;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cloudstack.api.command.admin.solidfire.CreateReferenceToSolidFireClusterCmd;
+import org.apache.cloudstack.api.command.admin.solidfire.CreateSolidFireVirtualNetworkCmd;
+import org.apache.cloudstack.api.command.admin.solidfire.DeleteReferenceToSolidFireClusterCmd;
+import org.apache.cloudstack.api.command.admin.solidfire.DeleteSolidFireVirtualNetworkCmd;
+import org.apache.cloudstack.api.command.admin.solidfire.ListSolidFireClustersCmd;
+import org.apache.cloudstack.api.command.admin.solidfire.UpdateReferenceToSolidFireClusterCmd;
+import org.apache.cloudstack.api.command.admin.solidfire.UpdateSolidFireVirtualNetworkCmd;
+import org.apache.cloudstack.api.command.user.solidfire.CreateSolidFireVolumeCmd;
+import org.apache.cloudstack.api.command.user.solidfire.DeleteSolidFireVolumeCmd;
+import org.apache.cloudstack.api.command.user.solidfire.ListSolidFireVirtualNetworksCmd;
+import org.apache.cloudstack.api.command.user.solidfire.ListSolidFireVolumesCmd;
+import org.apache.cloudstack.api.command.user.solidfire.UpdateSolidFireVolumeCmd;
+import org.springframework.stereotype.Component;
+
+import com.cloud.utils.component.AdapterBase;
+
+@Component
+public class ApiSolidFireServiceImpl extends AdapterBase implements ApiSolidFireService {
+    @Override
+    public List<Class<?>> getCommands() {
+        List<Class<?>> cmdList = new ArrayList<Class<?>>();
+
+        cmdList.add(ListSolidFireClustersCmd.class);
+        cmdList.add(CreateReferenceToSolidFireClusterCmd.class);
+        cmdList.add(UpdateReferenceToSolidFireClusterCmd.class);
+        cmdList.add(DeleteReferenceToSolidFireClusterCmd.class);
+
+        cmdList.add(ListSolidFireVirtualNetworksCmd.class);
+        cmdList.add(CreateSolidFireVirtualNetworkCmd.class);
+        cmdList.add(UpdateSolidFireVirtualNetworkCmd.class);
+        cmdList.add(DeleteSolidFireVirtualNetworkCmd.class);
+
+        cmdList.add(ListSolidFireVolumesCmd.class);
+        cmdList.add(CreateSolidFireVolumeCmd.class);
+        cmdList.add(UpdateSolidFireVolumeCmd.class);
+        cmdList.add(DeleteSolidFireVolumeCmd.class);
+
+        return cmdList;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/api/solidfire/SfApiConstants.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/api/solidfire/SfApiConstants.java b/plugins/api/solidfire/src/org/apache/cloudstack/api/solidfire/SfApiConstants.java
new file mode 100644
index 0000000..193361c
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/api/solidfire/SfApiConstants.java
@@ -0,0 +1,44 @@
+package org.apache.cloudstack.api.solidfire;
+
+public class SfApiConstants {
+    public static final String MVIP = "mvip";
+    public static final String SVIP = "svip";
+    public static final String CLUSTER_NAME = "clustername";
+    public static final String NAME = "name";
+    public static final String TAG = "tag";
+    public static final String START_IP = "startip";
+    public static final String SIZE = "size";
+    public static final String NETMASK = "netmask";
+    public static final String TOTAL_CAPACITY = "totalcapacity";
+    public static final String TOTAL_MIN_IOPS = "totalminiops";
+    public static final String TOTAL_MAX_IOPS = "totalmaxiops";
+    public static final String TOTAL_BURST_IOPS = "totalburstiops";
+    public static final String BURST_IOPS = "burstiops";
+    public static final String SF_VIRTUAL_NETWORK_ID = "sfvirtualnetworkid";
+
+    // descriptions
+    public static final String SOLIDFIRE_CLUSTER_NAME_DESC = "SolidFire cluster name";
+    public static final String SOLIDFIRE_MVIP_DESC = "SolidFire management virtual IP address";
+    public static final String SOLIDFIRE_SVIP_DESC = "SolidFire storage virtual IP address for VLAN";
+    public static final String SOLIDFIRE_USERNAME_DESC = "SolidFire cluster admin username";
+    public static final String SOLIDFIRE_PASSWORD_DESC = "SolidFire cluster admin password";
+    public static final String TOTAL_CAPACITY_DESC = "Total capacity (in GBs)";
+    public static final String TOTAL_MIN_IOPS_DESC = "Total minimum IOPS";
+    public static final String TOTAL_MAX_IOPS_DESC = "Total maximum IOPS";
+    public static final String TOTAL_BURST_IOPS_DESC = "Total burst IOPS";
+    public static final String IQN_DESC = "Volume IQN";
+    public static final String SIZE_DESC = "Size (in GBs)";
+    public static final String MIN_IOPS_DESC = "Min IOPS";
+    public static final String MAX_IOPS_DESC = "Max IOPS";
+    public static final String BURST_IOPS_DESC = "Burst IOPS";
+    public static final String VIRTUAL_NETWORK_NAME_DESC = "VLAN name";
+    public static final String VIRTUAL_NETWORK_TAG_DESC = "VLAN tag";
+    public static final String START_IP_ADDRESS_DESC = "Start IP address";
+    public static final String NUMBER_OF_IP_ADDRESSES_DESC = "Number of contiguous IP addresses starting at '" + SfApiConstants.START_IP + "'";
+    public static final String NETMASK_DESC = "Netmask of VLAN";
+    public static final String ACCOUNT_ID_DESC = "Account ID";
+    public static final String VIRTUAL_NETWORK_ID_DESC = "Virtual network ID";
+    public static final String VOLUME_ID_DESC = "Volume ID";
+    public static final String VOLUME_NAME_DESC = "Volume name";
+    public static final String ZONE_ID_DESC = "Zone ID";
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfClusterDao.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfClusterDao.java b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfClusterDao.java
new file mode 100644
index 0000000..a2537be
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfClusterDao.java
@@ -0,0 +1,29 @@
+// 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 org.apache.cloudstack.dataaccess.dao.solidfire;
+
+import java.util.List;
+
+import org.apache.cloudstack.dataaccess.vo.solidfire.SfClusterVO;
+
+import com.cloud.utils.db.GenericDao;
+
+public interface SfClusterDao extends GenericDao<SfClusterVO, Long> {
+    SfClusterVO findByName(String name);
+
+    List<SfClusterVO> findByZoneId(long zoneId);
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfClusterDaoImpl.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfClusterDaoImpl.java b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfClusterDaoImpl.java
new file mode 100644
index 0000000..f4db610
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfClusterDaoImpl.java
@@ -0,0 +1,62 @@
+// 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 org.apache.cloudstack.dataaccess.dao.solidfire;
+
+import java.util.List;
+
+import javax.ejb.Local;
+
+import org.apache.cloudstack.dataaccess.vo.solidfire.SfClusterVO;
+import org.springframework.stereotype.Component;
+
+import com.cloud.utils.db.DB;
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.SearchCriteria.Op;
+
+@Component
+@Local(value = SfClusterVO.class)
+public class SfClusterDaoImpl extends GenericDaoBase<SfClusterVO, Long> implements SfClusterDao {
+    @SuppressWarnings("deprecation")
+    @Override
+    @DB()
+    public SfClusterVO findByName(final String name) {
+        SearchCriteria<SfClusterVO> sc = createSearchCriteria();
+
+        sc.addAnd("name", SearchCriteria.Op.EQ, name);
+
+        return findOneBy(sc);
+    }
+
+    @Override
+    public List<SfClusterVO> findByZoneId(long zoneId) {
+        String columnName = "zoneId";
+
+        SearchBuilder<SfClusterVO> searchBuilder = createSearchBuilder();
+
+        searchBuilder.and(columnName, searchBuilder.entity().getZoneId(), Op.EQ);
+
+        searchBuilder.done();
+
+        SearchCriteria<SfClusterVO> sc = searchBuilder.create();
+
+        sc.setParameters(columnName, zoneId);
+
+        return listBy(sc);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVirtualNetworkDao.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVirtualNetworkDao.java b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVirtualNetworkDao.java
new file mode 100644
index 0000000..3a3a2a6
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVirtualNetworkDao.java
@@ -0,0 +1,29 @@
+// 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 org.apache.cloudstack.dataaccess.dao.solidfire;
+
+import java.util.List;
+
+import org.apache.cloudstack.dataaccess.vo.solidfire.SfVirtualNetworkVO;
+
+import com.cloud.utils.db.GenericDao;
+
+public interface SfVirtualNetworkDao extends GenericDao<SfVirtualNetworkVO, Long> {
+    List<SfVirtualNetworkVO> findByClusterId(long clusterId);
+
+    List<SfVirtualNetworkVO> findByAccountId(long accountId);
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVirtualNetworkDaoImpl.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVirtualNetworkDaoImpl.java b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVirtualNetworkDaoImpl.java
new file mode 100644
index 0000000..56bd5b9
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVirtualNetworkDaoImpl.java
@@ -0,0 +1,67 @@
+// 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 org.apache.cloudstack.dataaccess.dao.solidfire;
+
+import java.util.List;
+
+import javax.ejb.Local;
+
+import org.apache.cloudstack.dataaccess.vo.solidfire.SfVirtualNetworkVO;
+import org.springframework.stereotype.Component;
+
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.SearchCriteria.Op;
+
+@Component
+@Local(value = SfVirtualNetworkVO.class)
+public class SfVirtualNetworkDaoImpl extends GenericDaoBase<SfVirtualNetworkVO, Long> implements SfVirtualNetworkDao {
+    @Override
+    public List<SfVirtualNetworkVO> findByClusterId(long clusterId) {
+        String columnName = "sf_cluster_id";
+
+        SearchBuilder<SfVirtualNetworkVO> searchBuilder = createSearchBuilder();
+
+        searchBuilder.and(columnName, searchBuilder.entity().getSfClusterId(), Op.EQ);
+
+        searchBuilder.done();
+
+        SearchCriteria<SfVirtualNetworkVO> sc = searchBuilder.create();
+
+        sc.setParameters(columnName, clusterId);
+
+        return listBy(sc);
+    }
+
+    @Override
+    public List<SfVirtualNetworkVO> findByAccountId(long accountId) {
+        String columnName = "account_id";
+
+        SearchBuilder<SfVirtualNetworkVO> searchBuilder = createSearchBuilder();
+
+        searchBuilder.and(columnName, searchBuilder.entity().getAccountId(), Op.EQ);
+
+        searchBuilder.done();
+
+        SearchCriteria<SfVirtualNetworkVO> sc = searchBuilder.create();
+
+        sc.setParameters(columnName, accountId);
+
+        return listBy(sc);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVolumeDao.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVolumeDao.java b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVolumeDao.java
new file mode 100644
index 0000000..10a58ef
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVolumeDao.java
@@ -0,0 +1,27 @@
+// 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 org.apache.cloudstack.dataaccess.dao.solidfire;
+
+import java.util.List;
+
+import org.apache.cloudstack.dataaccess.vo.solidfire.SfVolumeVO;
+
+import com.cloud.utils.db.GenericDao;
+
+public interface SfVolumeDao extends GenericDao<SfVolumeVO, Long> {
+    List<SfVolumeVO> findBySfVirtualNetworkId(long sfVirtualNetworkId);
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVolumeDaoImpl.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVolumeDaoImpl.java b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVolumeDaoImpl.java
new file mode 100644
index 0000000..23824a3
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/dao/solidfire/SfVolumeDaoImpl.java
@@ -0,0 +1,50 @@
+// 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 org.apache.cloudstack.dataaccess.dao.solidfire;
+
+import java.util.List;
+
+import javax.ejb.Local;
+
+import org.apache.cloudstack.dataaccess.vo.solidfire.SfVolumeVO;
+import org.springframework.stereotype.Component;
+
+import com.cloud.utils.db.GenericDaoBase;
+import com.cloud.utils.db.SearchBuilder;
+import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.SearchCriteria.Op;
+
+@Component
+@Local(value = SfVolumeVO.class)
+public class SfVolumeDaoImpl extends GenericDaoBase<SfVolumeVO, Long> implements SfVolumeDao {
+    @Override
+    public List<SfVolumeVO> findBySfVirtualNetworkId(long sfVirtualNetworkId) {
+        String columnName = "sf_virtual_network_id";
+
+        SearchBuilder<SfVolumeVO> searchBuilder = createSearchBuilder();
+
+        searchBuilder.and(columnName, searchBuilder.entity().getSfVirtualNetworkId(), Op.EQ);
+
+        searchBuilder.done();
+
+        SearchCriteria<SfVolumeVO> sc = searchBuilder.create();
+
+        sc.setParameters(columnName, sfVirtualNetworkId);
+
+        return listBy(sc);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/vo/solidfire/SfClusterVO.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/vo/solidfire/SfClusterVO.java b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/vo/solidfire/SfClusterVO.java
new file mode 100644
index 0000000..ca5bb60
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/vo/solidfire/SfClusterVO.java
@@ -0,0 +1,173 @@
+// 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 org.apache.cloudstack.dataaccess.vo.solidfire;
+
+import java.util.Date;
+import java.util.UUID;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.apache.cloudstack.solidfire.SfCluster;
+
+import com.cloud.utils.db.GenericDao;
+
+@Entity
+@Table(name = "sf_cluster")
+public class SfClusterVO implements SfCluster {
+    private static final long serialVersionUID = 1;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private long id;
+
+    @Column(name = "uuid")
+    private String uuid;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "mvip")
+    private String mvip;
+
+    @Column(name = "username")
+    private String username;
+
+    @Column(name = "password")
+    private String password;
+
+    @Column(name = "total_capacity")
+    private long totalCapacity;
+
+    @Column(name = "total_min_iops")
+    private long totalMinIops;
+
+    @Column(name = "total_max_iops")
+    private long totalMaxIops;
+
+    @Column(name = "total_burst_iops")
+    private long totalBurstIops;
+
+    @Column(name = "zone_id")
+    private long zoneId;
+
+    @Column(name = GenericDao.CREATED_COLUMN)
+    private Date created;
+
+    @Column(name = "updated")
+    @Temporal(value = TemporalType.TIMESTAMP)
+    private Date updated;
+
+    @Column(name = GenericDao.REMOVED_COLUMN)
+    private Date removed;
+
+    public SfClusterVO() {
+        uuid = UUID.randomUUID().toString();
+    }
+
+    public SfClusterVO(String name, String mvip, String username, String password, long totalCapacity,
+            long totalMinIops, long totalMaxIops, long totalBurstIops,long zoneId) {
+        this.uuid = UUID.randomUUID().toString();
+        this.name = name;
+        this.mvip = mvip;
+        this.username = username;
+        this.password = password;
+        this.totalCapacity = totalCapacity;
+        this.totalMinIops = totalMinIops;
+        this.totalMaxIops = totalMaxIops;
+        this.totalBurstIops = totalBurstIops;
+        this.zoneId = zoneId;
+    }
+
+    @Override
+    public long getId() {
+        return id;
+    }
+
+    @Override
+    public String getUuid() {
+        return uuid;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String getMvip() {
+        return mvip;
+    }
+
+    @Override
+    public String getUsername() {
+        return username;
+    }
+
+    @Override
+    public String getPassword() {
+        return password;
+    }
+
+    public void setTotalCapacity(long totalCapacity) {
+        this.totalCapacity = totalCapacity;
+    }
+
+    @Override
+    public long getTotalCapacity() {
+        return totalCapacity;
+    }
+
+    public void setTotalMinIops(long totalMinIops) {
+        this.totalMinIops = totalMinIops;
+    }
+
+    @Override
+    public long getTotalMinIops() {
+        return totalMinIops;
+    }
+
+    public void setTotalMaxIops(long totalMaxIops) {
+        this.totalMaxIops = totalMaxIops;
+    }
+
+    @Override
+    public long getTotalMaxIops() {
+        return totalMaxIops;
+    }
+
+    public void setTotalBurstIops(long totalBurstIops) {
+        this.totalBurstIops = totalBurstIops;
+    }
+
+    @Override
+    public long getTotalBurstIops() {
+        return totalBurstIops;
+    }
+
+    @Override
+    public long getZoneId() {
+        return zoneId;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/vo/solidfire/SfVirtualNetworkVO.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/vo/solidfire/SfVirtualNetworkVO.java b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/vo/solidfire/SfVirtualNetworkVO.java
new file mode 100644
index 0000000..2f0fb02
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/vo/solidfire/SfVirtualNetworkVO.java
@@ -0,0 +1,180 @@
+// 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 org.apache.cloudstack.dataaccess.vo.solidfire;
+
+import java.util.Date;
+import java.util.UUID;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.apache.cloudstack.solidfire.SfVirtualNetwork;
+
+import com.cloud.utils.db.GenericDao;
+
+@Entity
+@Table(name = "sf_virtual_network")
+public class SfVirtualNetworkVO implements SfVirtualNetwork {
+    private static final long serialVersionUID = 1;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private long id;
+
+    @Column(name = "uuid")
+    private String uuid;
+
+    @Column(name = "sf_id")
+    private long sfId;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "tag")
+    private String tag;
+
+    @Column(name = "start_ip")
+    private String startIp;
+
+    @Column(name = "size")
+    private int size;
+
+    @Column(name = "netmask")
+    private String netmask;
+
+    @Column(name = "svip")
+    private String svip;
+
+    @Column(name = "account_id")
+    private long accountId;
+
+    @Column(name = "sf_cluster_id")
+    private long sfClusterId;
+
+    @Column(name = GenericDao.CREATED_COLUMN)
+    private Date created;
+
+    @Column(name = "updated")
+    @Temporal(value = TemporalType.TIMESTAMP)
+    private Date updated;
+
+    @Column(name = GenericDao.REMOVED_COLUMN)
+    private Date removed;
+
+    public SfVirtualNetworkVO() {
+        uuid = UUID.randomUUID().toString();
+    }
+
+    public SfVirtualNetworkVO(long sfId, String name, String tag, String startIp, int size, String netmask, String svip, long accountId, long sfClusterId) {
+        this.uuid = UUID.randomUUID().toString();
+        this.sfId = sfId;
+        this.name = name;
+        this.tag = tag;
+        this.startIp = startIp;
+        this.size = size;
+        this.netmask = netmask;
+        this.svip = svip;
+        this.accountId = accountId;
+        this.sfClusterId = sfClusterId;
+    }
+
+    @Override
+    public long getId() {
+        return id;
+    }
+
+    @Override
+    public String getUuid() {
+        return uuid;
+    }
+
+    @Override
+    public long getSfId() {
+        return sfId;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    public void setTag(String tag) {
+        this.tag = tag;
+    }
+
+    @Override
+    public String getTag() {
+        return tag;
+    }
+
+    public void setStartIp(String startIp) {
+        this.startIp = startIp;
+    }
+
+    @Override
+    public String getStartIp() {
+        return startIp;
+    }
+
+    public void setSize(int size) {
+        this.size = size;
+    }
+
+    @Override
+    public int getSize() {
+        return size;
+    }
+
+    public void setNetmask(String netmask) {
+        this.netmask = netmask;
+    }
+
+    @Override
+    public String getNetmask() {
+        return netmask;
+    }
+
+    public void setSvip(String svip) {
+        this.svip = svip;
+    }
+
+    @Override
+    public String getSvip() {
+        return svip;
+    }
+
+    @Override
+    public long getAccountId() {
+        return accountId;
+    }
+
+    @Override
+    public long getSfClusterId() {
+        return sfClusterId;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/vo/solidfire/SfVolumeVO.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/vo/solidfire/SfVolumeVO.java b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/vo/solidfire/SfVolumeVO.java
new file mode 100644
index 0000000..0fe748e
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/dataaccess/vo/solidfire/SfVolumeVO.java
@@ -0,0 +1,168 @@
+// 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 org.apache.cloudstack.dataaccess.vo.solidfire;
+
+import java.util.Date;
+import java.util.UUID;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.apache.cloudstack.solidfire.SfVolume;
+
+import com.cloud.utils.db.GenericDao;
+
+@Entity
+@Table(name = "sf_volume")
+public class SfVolumeVO implements SfVolume {
+    private static final long serialVersionUID = 1;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id")
+    private long id;
+
+    @Column(name = "uuid")
+    private String uuid;
+
+    @Column(name = "sf_id")
+    private long sfId;
+
+    @Column(name = "name")
+    private String name;
+
+    @Column(name = "iqn")
+    private String iqn;
+
+    @Column(name = "size")
+    private long size;
+
+    @Column(name = "min_iops")
+    private long minIops;
+
+    @Column(name = "max_iops")
+    private long maxIops;
+
+    @Column(name = "burst_iops")
+    private long burstIops;
+
+    @Column(name = "sf_virtual_network_id")
+    private long sfVirtualNetworkId;
+
+    @Column(name = GenericDao.CREATED_COLUMN)
+    private Date created;
+
+    @Column(name = "updated")
+    @Temporal(value = TemporalType.TIMESTAMP)
+    private Date updated;
+
+    @Column(name = GenericDao.REMOVED_COLUMN)
+    private Date removed;
+
+    public SfVolumeVO() {
+        uuid = UUID.randomUUID().toString();
+    }
+
+    public SfVolumeVO(long sfId, String name, String iqn, long size, long minIops, long maxIops, long burstIops, long sfVirtualNetworkId) {
+        this.uuid = UUID.randomUUID().toString();
+        this.sfId = sfId;
+        this.name = name;
+        this.iqn = iqn;
+        this.size = size;
+        this.minIops = minIops;
+        this.maxIops = maxIops;
+        this.burstIops = burstIops;
+        this.sfVirtualNetworkId = sfVirtualNetworkId;
+    }
+
+    @Override
+    public long getId() {
+        return id;
+    }
+
+    @Override
+    public String getUuid() {
+        return uuid;
+    }
+
+    @Override
+    public long getSfId() {
+        return sfId;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    @Override
+    public String getIqn() {
+        return iqn;
+    }
+
+    public void setSize(long size) {
+        this.size = size;
+    }
+
+    @Override
+    public long getSize() {
+        return size;
+    }
+
+    public void setMinIops(long minIops) {
+        this.minIops = minIops;
+    }
+
+    @Override
+    public long getMinIops() {
+        return minIops;
+    }
+
+    public void setMaxIops(long maxIops) {
+        this.maxIops = maxIops;
+    }
+
+    @Override
+    public long getMaxIops() {
+        return maxIops;
+    }
+
+    public void setBurstIops(long burstIops) {
+        this.burstIops = burstIops;
+    }
+
+    @Override
+    public long getBurstIops() {
+        return burstIops;
+    }
+
+    @Override
+    public long getSfVirtualNetworkId() {
+        return sfVirtualNetworkId;
+    }
+
+    @Override
+    public Date getCreated() {
+        return created;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SfCluster.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SfCluster.java b/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SfCluster.java
new file mode 100644
index 0000000..b2e0a32
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SfCluster.java
@@ -0,0 +1,40 @@
+// 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 org.apache.cloudstack.solidfire;
+
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+public interface SfCluster extends Identity, InternalIdentity {
+    String getName();
+
+    String getMvip();
+
+    String getUsername();
+
+    String getPassword();
+
+    long getTotalCapacity();
+
+    long getTotalMinIops();
+
+    long getTotalMaxIops();
+
+    long getTotalBurstIops();
+
+    long getZoneId();
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SfVirtualNetwork.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SfVirtualNetwork.java b/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SfVirtualNetwork.java
new file mode 100644
index 0000000..f41e319
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SfVirtualNetwork.java
@@ -0,0 +1,40 @@
+// 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 org.apache.cloudstack.solidfire;
+
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+public interface SfVirtualNetwork extends Identity, InternalIdentity {
+    long getSfId();
+
+    String getName();
+
+    String getTag();
+
+    String getStartIp();
+
+    int getSize();
+
+    String getNetmask();
+
+    String getSvip();
+
+    long getAccountId();
+
+    long getSfClusterId();
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SfVolume.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SfVolume.java b/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SfVolume.java
new file mode 100644
index 0000000..84218d0
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SfVolume.java
@@ -0,0 +1,42 @@
+// 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 org.apache.cloudstack.solidfire;
+
+import java.util.Date;
+
+import org.apache.cloudstack.api.Identity;
+import org.apache.cloudstack.api.InternalIdentity;
+
+public interface SfVolume extends Identity, InternalIdentity {
+    long getSfId();
+
+    String getName();
+
+    String getIqn();
+
+    long getSize();
+
+    long getMinIops();
+
+    long getMaxIops();
+
+    long getBurstIops();
+
+    long getSfVirtualNetworkId();
+
+    Date getCreated();
+}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/49ca3b40/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SolidFireManager.java
----------------------------------------------------------------------
diff --git a/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SolidFireManager.java b/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SolidFireManager.java
new file mode 100644
index 0000000..458d96b
--- /dev/null
+++ b/plugins/api/solidfire/src/org/apache/cloudstack/solidfire/SolidFireManager.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 org.apache.cloudstack.solidfire;
+
+import java.util.List;
+
+import org.apache.cloudstack.framework.config.Configurable;
+
+public interface SolidFireManager extends Configurable {
+    // ********** Cluster-related commands **********
+
+    SfCluster listSolidFireCluster(String clusterName);
+
+    List<SfCluster> listSolidFireClusters();
+
+    SfCluster createReferenceToSolidFireCluster(String mvip, String username, String password, long totalCapacity,
+            long totalMinIops, long totalMaxIops, long totalBurstIops, long zoneId);
+
+    SfCluster updateReferenceToSolidFireCluster(String clusterName, long totalCapacity,
+            long totalMinIops, long totalMaxIops, long totalBurstIops);
+
+    SfCluster deleteReferenceToSolidFireCluster(String clusterName);
+
+    // ********** VLAN-related commands **********
+
+    SfVirtualNetwork listSolidFireVirtualNetworkById(long id);
+
+    List<SfVirtualNetwork> listSolidFireVirtualNetworkByClusterName(String clusterName);
+
+    // Long (instead of long) for both zoneId and accountId because they're optional and null is used to indicate that they're not present
+    // zoneId and accountId are not dependent upon one another (i.e. either one can be null, both can be null, or both can be not be null)
+    List<SfVirtualNetwork> listSolidFireVirtualNetworks(Long zoneId, Long accountId);
+
+    SfVirtualNetwork createSolidFireVirtualNetwork(String clusterName, String name, String tag, String startIp, int size,
+            String netmask, String svip, long accountId);
+
+    SfVirtualNetwork updateSolidFireVirtualNetwork(long id, String name, String startIp, int size, String netmask);
+
+    SfVirtualNetwork deleteSolidFireVirtualNetwork(long id);
+
+ // ********** Volume-related commands **********
+
+    SfVolume listSolidFireVolume(long id);
+
+    List<SfVolume> listSolidFireVolumes();
+
+    SfVolume createSolidFireVolume(String name, long size, long minIops, long maxIops, long burstIops, long accountId, long sfVirtualNetworkId);
+
+    SfVolume updateSolidFireVolume(long id, long size, long minIops, long maxIops, long burstIops);
+
+    SfVolume deleteSolidFireVolume(long id);
+}