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/31 05:35:59 UTC

[4/7] git commit: updated refs/heads/sf-plugins-a to 37ca6e6

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/37ca6e69/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidFireSharedPrimaryDataStoreDriver.java
----------------------------------------------------------------------
diff --git a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidFireSharedPrimaryDataStoreDriver.java b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidFireSharedPrimaryDataStoreDriver.java
index a16408e..365533c 100644
--- a/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidFireSharedPrimaryDataStoreDriver.java
+++ b/plugins/storage/volume/solidfire/src/org/apache/cloudstack/storage/datastore/driver/SolidFireSharedPrimaryDataStoreDriver.java
@@ -16,50 +16,5 @@
 // under the License.
 package org.apache.cloudstack.storage.datastore.driver;
 
-import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult;
-import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataObject;
-import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
-import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo;
-import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
-import org.apache.cloudstack.storage.command.CommandResult;
-
-import com.cloud.agent.api.to.DataStoreTO;
-import com.cloud.agent.api.to.DataTO;
-
 public class SolidFireSharedPrimaryDataStoreDriver extends CloudStackPrimaryDataStoreDriverImpl {
-    @Override
-    public DataTO getTO(DataObject data) {
-        return null;
-    }
-
-    @Override
-    public DataStoreTO getStoreTO(DataStore store) {
-        return null;
-    }
-
-    @Override
-    public boolean canCopy(DataObject srcData, DataObject destData) {
-        return false;
-    }
-
-    @Override
-    public void copyAsync(DataObject srcdata, DataObject destData, AsyncCompletionCallback<CopyCommandResult> callback) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public void resize(DataObject data, AsyncCompletionCallback<CreateCmdResult> callback) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public void takeSnapshot(SnapshotInfo snapshot, AsyncCompletionCallback<CreateCmdResult> callback) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public void revertSnapshot(SnapshotInfo snapshot, AsyncCompletionCallback<CommandResult> callback) {
-        throw new UnsupportedOperationException();
-    }
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/37ca6e69/ui/plugins/plugins.js
----------------------------------------------------------------------
diff --git a/ui/plugins/plugins.js b/ui/plugins/plugins.js
index 386ec06..d115eef 100644
--- a/ui/plugins/plugins.js
+++ b/ui/plugins/plugins.js
@@ -16,6 +16,8 @@
 // under the License.
 (function($, cloudStack) {
   cloudStack.plugins = [
-    // 'testPlugin'
+    // 'testPlugin',
+    // 'sfSharedVolume',
+    // 'sfAdministration'
   ];
 }(jQuery, cloudStack));

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/37ca6e69/ui/plugins/sfAdministration/config.js
----------------------------------------------------------------------
diff --git a/ui/plugins/sfAdministration/config.js b/ui/plugins/sfAdministration/config.js
new file mode 100644
index 0000000..376ae56
--- /dev/null
+++ b/ui/plugins/sfAdministration/config.js
@@ -0,0 +1,9 @@
+(function (cloudStack) {
+  cloudStack.plugins.sfAdministration.config = {
+    title: 'SolidFire Administration',
+    desc: 'SolidFire Administration',
+    externalLink: 'http://www.solidfire.com/',
+    authorName: 'Mike Tutkowski',
+    authorEmail: 'mike.tutkowski@solidfire.com'
+  };
+}(cloudStack));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/37ca6e69/ui/plugins/sfAdministration/icon.png
----------------------------------------------------------------------
diff --git a/ui/plugins/sfAdministration/icon.png b/ui/plugins/sfAdministration/icon.png
new file mode 100644
index 0000000..a313d35
Binary files /dev/null and b/ui/plugins/sfAdministration/icon.png differ

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/37ca6e69/ui/plugins/sfAdministration/sfAdministration.js
----------------------------------------------------------------------
diff --git a/ui/plugins/sfAdministration/sfAdministration.js b/ui/plugins/sfAdministration/sfAdministration.js
new file mode 100644
index 0000000..ca07318
--- /dev/null
+++ b/ui/plugins/sfAdministration/sfAdministration.js
@@ -0,0 +1,566 @@
+(function (cloudStack) {
+  cloudStack.plugins.sfAdministration = function(plugin) {
+    plugin.ui.addSection({
+      id: 'sfAdministration',
+      title: 'SolidFire Administration',
+      sectionSelect: {
+        label: 'label.select-view',
+        preFilter: function() {
+          return ['sfAdministration'];
+        }
+      },
+      preFilter: function(args) {
+        return isAdmin();
+      },
+      sections: {
+        sfAdministration: {
+          id: 'sfAdministration',
+          type: 'select',
+          title: 'SolidFire Clusters',
+          listView: {
+            section: 'sfAdministration',
+            id: 'sfAdministration',
+            fields: {
+              name: { label: 'label.name' },
+              mvip: { label: 'MVIP' },
+              username: { label: 'Username' },
+              zonename: { label: 'label.zone' }
+            },
+            dataProvider: function(args) {
+              plugin.ui.apiCall('listSolidFireClusters', {
+                success: function(json) {
+                  var sfclustersfiltered = [];
+                  var sfclusters = json.listsolidfireclustersresponse.sfcluster;
+                  var search = args.filterBy.search.value == null ? "" : args.filterBy.search.value.toLowerCase();
+
+                  if (search == "") {
+                    sfclustersfiltered = sfclusters;
+                  }
+                  else {
+                    for (i = 0; i < sfclusters.length; i++) {
+                      sfcluster = sfclusters[i];
+
+                      if (sfcluster.name.toLowerCase().indexOf(search) > -1 ) {
+                        sfclustersfiltered.push(sfcluster);
+                      }
+                    }
+                  }
+
+                  args.response.success({ data: sfclustersfiltered });
+                },
+                error: function(errorMessage) {
+                  args.response.error(errorMessage);
+                }
+              });
+            },
+            actions: {
+              add: {
+                label: 'Add Reference to Cluster',
+                preFilter: function(args) {
+                  return true;
+                },
+                messages: {
+                  confirm: function(args) {
+                    return 'Please fill in the following data to add a reference to a cluster.';
+                  },
+                  notification: function(args) {
+                    return 'Add Reference to Cluster';
+                  }
+                },
+                createForm: {
+                  title: 'Add Reference to Cluster',
+                  desc: 'Please fill in the following data to add a reference to a cluster.',
+                  fields: {
+                    availabilityZone: {
+                      label: 'label.availability.zone',
+                      docID: 'helpVolumeAvailabilityZone',
+                      validation: {
+                        required: true
+                      },
+                      select: function(args) {
+                        $.ajax({
+                          url: createURL("listZones&available=true"),
+                          dataType: "json",
+                          async: true,
+                          success: function(json) {
+                            var zoneObjs = json.listzonesresponse.zone;
+
+                            args.response.success({
+                              descriptionField: 'name',
+                              data: zoneObjs
+                            });
+                          }
+                        });
+                      }
+                    },
+                    mvip: {
+                      label: 'MVIP',
+                      validation: {
+                        required: true
+                      }
+                    },
+                    username: {
+                      label: 'label.username',
+                      validation: {
+                        required: true
+                      }
+                    },
+                    password: {
+                      label: 'label.password',
+                      isPassword: true,
+                      validation: {
+                        required: true
+                      }
+                    },
+                    totalCapacity: {
+                      label: 'Total Capacity (in GB)',
+                      validation: {
+                        required: true,
+                        number: true
+                      }
+                    },
+                    totalMinIops: {
+                      label: 'Total Min IOPS',
+                      validation: {
+                        required: true,
+                        number: true
+                      }
+                    },
+                    totalMaxIops: {
+                      label: 'Total Max IOPS',
+                      validation: {
+                        required: true,
+                        number: true
+                      }
+                    },
+                    totalBurstIops: {
+                      label: 'Total Burst IOPS',
+                      validation: {
+                        required: true,
+                        number: true
+                      }
+                    }
+                  }
+                },
+                action: function(args) {
+                  var data = {
+                    zoneid: args.data.availabilityZone,
+                    mvip: args.data.mvip,
+                    username: args.data.username,
+                    password: args.data.password,
+                    totalcapacity: args.data.totalCapacity,
+                    totalminiops: args.data.totalMinIops,
+                    totalmaxiops: args.data.totalMaxIops,
+                    totalburstiops: args.data.totalBurstIops
+                  };
+
+                  $.ajax({
+                    url: createURL('createReferenceToSolidFireCluster'),
+                    data: data,
+                    success: function(json) {
+                      var sfclusterObj = json.createreferencetosolidfireclusterresponse.apicreatereferencetosolidfirecluster;
+
+                      args.response.success({
+                        data: sfclusterObj
+                      });
+                    },
+                    error: function(json) {
+                      args.response.error(parseXMLHttpResponse(json));
+                    }
+                  });
+                }
+              }
+            },
+            detailView: {
+              name: 'label.details',
+              viewAll: {
+                path: 'sfAdministration.sfVirtualNetworks',
+                label: 'Virtual Networks'
+              },
+              actions: {
+                edit: {
+                  label: 'label.edit',
+                  messages: {
+                    notification: function(args) {
+                      return 'Edit Cluster';
+                    }
+                  },
+                  action: function (args) {
+                    var params = [];
+
+                    params.push("&name=" + args.context.sfAdministration[0].name);
+                    params.push("&totalcapacity=" + args.data.totalcapacity);
+                    params.push("&totalminiops=" + args.data.totalminiops);
+                    params.push("&totalmaxiops=" + args.data.totalmaxiops);
+                    params.push("&totalburstiops=" + args.data.totalburstiops);
+
+                    $.ajax({
+                      url: createURL('updateReferenceToSolidFireCluster' + params.join("")),
+                      success: function(json) {
+                        var sfclusterObj = json.updatereferencetosolidfireclusterresponse.apiupdatereferencetosolidfirecluster;
+
+                        args.response.success({
+                          data: sfclusterObj
+                        });
+                      },
+                      error: function(json) {
+                        args.response.error(parseXMLHttpResponse(json));
+                      }
+                    });
+                  }
+                },
+                remove: {
+                  label: 'Delete Reference to Cluster',
+                  messages: {
+                    confirm: function(args) {
+                      return 'Are you sure you would like to delete this reference to a SolidFire cluster?';
+                    },
+                    notification: function(args) {
+                      return 'Delete Reference to Cluster';
+                    }
+                  },
+                  action: function(args) {
+                    $.ajax({
+                      url: createURL('deleteReferenceToSolidFireCluster&name=' + args.context.sfAdministration[0].name),
+                      success: function(json) {
+                        args.response.success();
+                      },
+                      error: function(json) {
+                        args.response.error(parseXMLHttpResponse(json));
+                      }
+                    });
+                  }
+                }
+              },
+              tabs: {
+                details: {
+                  title: 'label.details',
+                  preFilter: function(args) {
+                    return [];
+                  },
+                  fields: [
+                    {
+                      name: {
+                        label: 'label.name'
+                      }
+                    },
+                    {
+                      uuid: {
+                        label: 'label.id'
+                      },
+                      zonename: {
+                        label: 'label.zone'
+                      },
+                      mvip: {
+                        label: 'MVIP'
+                      },
+                      username: {
+                        label: 'Username'
+                      },
+                      totalcapacity: {
+                        label: 'Total Capacity (in GB)',
+                        isEditable: true
+                      },
+                      totalminiops: {
+                        label: 'Total Min IOPS',
+                        isEditable: true
+                      },
+                      totalmaxiops: {
+                        label: 'Total Max IOPS',
+                        isEditable: true
+                      },
+                      totalburstiops: {
+                        label: 'Total Burst IOPS',
+                        isEditable: true
+                      }
+                    }
+                  ],
+                  dataProvider: function(args) {
+                    $.ajax({
+                      url: createURL("listSolidFireClusters&name=" + args.context.sfAdministration[0].name),
+                      dataType: "json",
+                      async: true,
+                      success: function(json) {
+                        var jsonObj = json.listsolidfireclustersresponse.sfcluster[0];
+
+                        args.response.success({
+                          data: jsonObj
+                        });
+                      }
+                    });
+                  }
+                }
+              }
+            }
+          }
+        },
+        sfVirtualNetworks: {
+          id: 'sfVirtualNetworks',
+          type: 'select',
+          title: 'SolidFire Virtual Networks',
+          listView: {
+            section: 'sfVirtualNetworks',
+            id: 'sfVirtualNetworks',
+            fields: {
+              name: { label: 'label.name' },
+              tag: { label: 'Tag' },
+              svip: { label: 'SVIP' },
+              accountname: { label: 'label.account' }
+            },
+            dataProvider: function(args) {
+              var clustername = args.context.sfAdministration[0].name;
+
+              plugin.ui.apiCall('listSolidFireVirtualNetworks&clustername=' + clustername, {
+                success: function(json) {
+                  var sfvirtualnetworksfiltered = [];
+                  var sfvirtualnetworks = json.listsolidfirevirtualnetworksresponse.sfvirtualnetwork;
+                  var search = args.filterBy.search.value == null ? "" : args.filterBy.search.value.toLowerCase();
+
+                  if (search == "") {
+                    sfvirtualnetworksfiltered = sfvirtualnetworks;
+                  }
+                  else {
+                    for (i = 0; i < sfvirtualnetworks.length; i++) {
+                      sfvirtualnetwork = sfvirtualnetworks[i];
+
+                      if (sfvirtualnetwork.name.toLowerCase().indexOf(search) > -1 ) {
+                        sfvirtualnetworksfiltered.push(sfvirtualnetwork);
+                      }
+                    }
+                  }
+
+                  args.response.success({ data: sfvirtualnetworksfiltered });
+                },
+                error: function(errorMessage) {
+                  args.response.error(errorMessage);
+                }
+              });
+            },
+            actions: {
+              add: {
+                label: 'Add Virtual Network',
+                preFilter: function(args) {
+                  return true;
+                },
+                messages: {
+                  confirm: function(args) {
+                    return 'Please fill in the following data to add a virtual network.';
+                  },
+                  notification: function(args) {
+                    return 'Add Virtual Network';
+                  }
+                },
+                createForm: {
+                  title: 'Add Virtual Network',
+                  desc: 'Please fill in the following data to add a virtual network.',
+                  fields: {
+                    account: {
+                      label: 'Account',
+                      validation: {
+                        required: true
+                      },
+                      select: function(args) {
+                        $.ajax({
+                          url: createURL("listAccounts&listAll=true"),
+                          dataType: "json",
+                          async: true,
+                          success: function(json) {
+                            var accountObjs = json.listaccountsresponse.account;
+
+                            args.response.success({
+                              descriptionField: 'name',
+                              data: accountObjs
+                            });
+                          }
+                        });
+                      }
+                    },
+                    name: {
+                      label: 'Name',
+                      validation: {
+                        required: true
+                      }
+                    },
+                    tag: {
+                      label: 'Tag',
+                      validation: {
+                        required: true
+                      }
+                    },
+                    netmask: {
+                      label: 'Netmask',
+                      validation: {
+                        required: true
+                      }
+                    },
+                    startip: {
+                      label: 'Start IP',
+                      validation: {
+                        required: true
+                      }
+                    },
+                    size: {
+                      label: 'Size',
+                      validation: {
+                        required: true,
+                        number: true
+                      }
+                    },
+                    svip: {
+                      label: 'SVIP',
+                      validation: {
+                        required: true
+                      }
+                    }
+                  }
+                },
+                action: function(args) {
+                  var data = {
+                    clustername: args.context.sfAdministration[0].name,
+                    accountid: args.data.account,
+                    name: args.data.name,
+                    tag: args.data.tag,
+                    netmask: args.data.netmask,
+                    startip: args.data.startip,
+                    size: args.data.size,
+                    svip: args.data.svip
+                  };
+
+                  $.ajax({
+                    url: createURL('createSolidFireVirtualNetwork'),
+                    data: data,
+                    success: function(json) {
+                      var sfVirtualNetworkObj = json.createsolidfirevirtualnetworkresponse.apicreatesolidfirevirtualnetwork;
+
+                      args.response.success({
+                        data: sfVirtualNetworkObj
+                      });
+                    },
+                    error: function(json) {
+                      args.response.error(parseXMLHttpResponse(json));
+                    }
+                  });
+                }
+              }
+            },
+            detailView: {
+              name: 'label.details',
+              actions: {
+                edit: {
+                  label: 'label.edit',
+                  messages: {
+                    notification: function(args) {
+                      return 'Edit Virtual Network';
+                    }
+                  },
+                  action: function (args) {
+                    var params = [];
+
+                    params.push("&id=" + args.context.sfVirtualNetworks[0].id);
+                    params.push("&name=" + args.data.name);
+                    params.push("&netmask=" + args.data.netmask);
+                    params.push("&startip=" + args.data.startip);
+                    params.push("&size=" + args.data.size);
+
+                    $.ajax({
+                      url: createURL('updateSolidFireVirtualNetwork' + params.join("")),
+                      success: function(json) {
+                        var sfVirtualNetworkObj = json.updatesolidfirevirtualnetworkresponse.apiupdatesolidfirevirtualnetwork;
+
+                        args.response.success({
+                          data: sfVirtualNetworkObj
+                        });
+                      },
+                      error: function(json) {
+                        args.response.error(parseXMLHttpResponse(json));
+                      }
+                    });
+                  }
+                },
+                remove: {
+                  label: 'Delete Virtual Network',
+                  messages: {
+                    confirm: function(args) {
+                      return 'Are you sure you would like to delete this virtual network?';
+                    },
+                    notification: function(args) {
+                      return 'Delete Virtual Network';
+                    }
+                  },
+                  action: function(args) {
+                    $.ajax({
+                      url: createURL('deleteSolidFireVirtualNetwork&id=' + args.context.sfVirtualNetworks[0].id),
+                      success: function(json) {
+                        args.response.success();
+                      },
+                      error: function(json) {
+                        args.response.error(parseXMLHttpResponse(json));
+                      }
+                    });
+                  }
+                }
+              },
+              tabs: {
+                details: {
+                  title: 'label.details',
+                  preFilter: function(args) {
+                    return [];
+                  },
+                  fields: [
+                    {
+                      name: {
+                        label: 'label.name',
+                        isEditable: true
+                      }
+                    },
+                    {
+                      uuid: {
+                        label: 'label.id'
+                      },
+                      accountname: {
+                        label: 'label.account'
+                      },
+                      tag: {
+                        label: 'Tag'
+                      },
+                      netmask: {
+                        label: 'Netmask',
+                        isEditable: true
+                      },
+                      startip: {
+                        label: 'Start IP',
+                        isEditable: true
+                      },
+                      size: {
+                        label: 'Size',
+                        number: true,
+                        isEditable: true
+                      },
+                      svip: {
+                        label: 'SVIP'
+                      }
+                    }
+                  ],
+                  dataProvider: function(args) {
+                    $.ajax({
+                      url: createURL("listSolidFireVirtualNetworks&id=" + args.context.sfVirtualNetworks[0].id),
+                      dataType: "json",
+                      async: true,
+                      success: function(json) {
+                        var jsonObj = json.listsolidfirevirtualnetworksresponse.sfvirtualnetwork[0];
+
+                        args.response.success({
+                          data: jsonObj
+                        });
+                      }
+                    });
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    });
+  };
+}(cloudStack));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/37ca6e69/ui/plugins/sfSharedVolume/config.js
----------------------------------------------------------------------
diff --git a/ui/plugins/sfSharedVolume/config.js b/ui/plugins/sfSharedVolume/config.js
new file mode 100644
index 0000000..3784be6
--- /dev/null
+++ b/ui/plugins/sfSharedVolume/config.js
@@ -0,0 +1,9 @@
+(function (cloudStack) {
+  cloudStack.plugins.sfSharedVolume.config = {
+    title: 'Shared Volume',
+    desc: 'Shared Volume',
+    externalLink: 'http://www.solidfire.com/',
+    authorName: 'Mike Tutkowski',
+    authorEmail: 'mike.tutkowski@solidfire.com'
+  };
+}(cloudStack));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/37ca6e69/ui/plugins/sfSharedVolume/icon.png
----------------------------------------------------------------------
diff --git a/ui/plugins/sfSharedVolume/icon.png b/ui/plugins/sfSharedVolume/icon.png
new file mode 100644
index 0000000..a313d35
Binary files /dev/null and b/ui/plugins/sfSharedVolume/icon.png differ

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/37ca6e69/ui/plugins/sfSharedVolume/sfSharedVolume.js
----------------------------------------------------------------------
diff --git a/ui/plugins/sfSharedVolume/sfSharedVolume.js b/ui/plugins/sfSharedVolume/sfSharedVolume.js
new file mode 100644
index 0000000..6d4c791
--- /dev/null
+++ b/ui/plugins/sfSharedVolume/sfSharedVolume.js
@@ -0,0 +1,377 @@
+(function (cloudStack) {
+  cloudStack.plugins.sfSharedVolume = function(plugin) {
+    plugin.ui.addSection({
+      id: 'sfSharedVolume',
+      title: 'Shared Volume',
+      preFilter: function(args) {
+        return true;
+      },
+      listView: {
+        id: 'sfSharedVolumes',
+        fields: {
+          name: { label: 'label.name' },
+          iqn: { label: 'IQN' },
+          size: { label: 'Size (GB)' },
+          miniops: { label: 'Min IOPS' },
+          maxiops: { label: 'Max IOPS' },
+          burstiops: { label: 'Burst IOPS' }
+        },
+        dataProvider: function(args) {
+          plugin.ui.apiCall('listSolidFireVolumes', {
+            success: function(json) {
+              var sfvolumesfiltered = [];
+              var sfvolumes = json.listsolidfirevolumesresponse.sfvolume;
+              var search = args.filterBy.search.value == null ? "" : args.filterBy.search.value.toLowerCase();
+
+              if (search == "") {
+                sfvolumesfiltered = sfvolumes;
+              }
+              else {
+                for (i = 0; i < sfvolumes.length; i++) {
+                  sfvolume = sfvolumes[i];
+
+                  if (sfvolume.name.toLowerCase().indexOf(search) > -1 ) {
+                    sfvolumesfiltered.push(sfvolume);
+                  }
+                }
+              }
+
+              args.response.success({ data: sfvolumesfiltered });
+            },
+            error: function(errorMessage) {
+              args.response.error(errorMessage);
+            }
+          });
+        },
+        actions: {
+          add: {
+            label: 'Add Shared Volume',
+            preFilter: function(args) {
+              return true;
+            },
+            messages: {
+              confirm: function(args) {
+                return 'Please fill in the following data to add a new shared volume.';
+              },
+              notification: function(args) {
+                return 'Add Shared Volume';
+              }
+            },
+            createForm: {
+              title: 'Add Shared Volume',
+              desc: 'Please fill in the following data to add a new shared volume.',
+              fields: {
+                availabilityZone: {
+                  label: 'label.availability.zone',
+                  docID: 'helpVolumeAvailabilityZone',
+                  validation: {
+                    required: true
+                  },
+                  select: function(args) {
+                    $.ajax({
+                      url: createURL("listZones&available=true"),
+                      dataType: "json",
+                      async: true,
+                      success: function(json) {
+                        var zoneObjs = json.listzonesresponse.zone;
+
+                        args.response.success({
+                          descriptionField: 'name',
+                          data: zoneObjs
+                        });
+                      }
+                    });
+                  }
+                },
+                name: {
+                  label: 'label.name',
+                  docID: 'helpVolumeName',
+                  validation: {
+                    required: true
+                  }
+                },
+                diskSize: {
+                  label: 'label.disk.size.gb',
+                  validation: {
+                    required: true,
+                    number: true
+                  }
+                },
+                minIops: {
+                  label: 'label.disk.iops.min',
+                  validation: {
+                    required: true,
+                    number: true
+                  }
+                },
+                maxIops: {
+                  label: 'label.disk.iops.max',
+                  validation: {
+                    required: true,
+                    number: true
+                  }
+                },
+                burstIops: {
+                  label: 'Burst IOPS',
+                  validation: {
+                    required: true,
+                    number: true
+                  }
+                },
+                account: {
+                  label: 'Account',
+                  validation: {
+                    required: true
+                  },
+                  isHidden: true,
+                  select: function(args) {
+                    var accountNameParam = "";
+
+                    if (isAdmin()) {
+                      args.$form.find('.form-item[rel=account]').show();
+                    }
+                    else {
+                      accountNameParam = "&name=" + g_account;
+                    }
+
+                    $.ajax({
+                      url: createURL("listAccounts&listAll=true" + accountNameParam),
+                      dataType: "json",
+                      async: true,
+                      success: function(json) {
+                        var accountObjs = json.listaccountsresponse.account;
+                        var filteredAccountObjs = [];
+
+                        if (isAdmin()) {
+                          filteredAccountObjs = accountObjs;
+                        }
+                        else {
+                          for (i = 0; i < accountObjs.length; i++) {
+                            var accountObj = accountObjs[i];
+
+                            if (accountObj.domainid == g_domainid) {
+                              filteredAccountObjs.push(accountObj);
+
+                              break; // there should only be one account with a particular name in a domain
+                            }
+                          }
+                        }
+
+                        args.response.success({
+                          descriptionField: 'name',
+                          data: filteredAccountObjs
+                        });
+                      }
+                    });
+                  }
+                },
+                vlan: {
+                  label: 'VLAN',
+                  validation: {
+                    required: true
+                  },
+                  dependsOn: ['availabilityZone', 'account'],
+                  select: function(args) {
+                    if (args.data.availabilityZone == null || args.data.availabilityZone == "" ||
+                        args.data.account == null || args.data.account == "") {
+                      return;
+                    }
+
+                    var params = [];
+
+                    params.push("&zoneid=" + args.data.availabilityZone);
+                    params.push("&accountid=" + args.data.account);
+
+                    $.ajax({
+                      url: createURL("listSolidFireVirtualNetworks" + params.join("")),
+                      dataType: "json",
+                      async: true,
+                      success: function(json) {
+                        var virtualNetworkObjs = json.listsolidfirevirtualnetworksresponse.sfvirtualnetwork;
+
+                        args.response.success({
+                          descriptionField: 'name',
+                          data: virtualNetworkObjs
+                        });
+                      }
+                    });
+                  }
+                }
+              }
+            },
+            action: function(args) {
+              var data = {
+                name: args.data.name,
+                size: args.data.diskSize,
+                miniops: args.data.minIops,
+                maxiops: args.data.maxIops,
+                burstiops: args.data.burstIops,
+                accountid: args.data.account,
+                sfvirtualnetworkid: args.data.vlan
+              };
+
+              $.ajax({
+                url: createURL('createSolidFireVolume'),
+                data: data,
+                success: function(json) {
+                  var sfvolumeObj = json.createsolidfirevolumeresponse.apicreatesolidfirevolume;
+
+                  args.response.success({
+                    data: sfvolumeObj
+                  });
+                },
+                error: function(json) {
+                  args.response.error(parseXMLHttpResponse(json));
+                }
+              });
+            }
+          }
+        },
+        detailView: {
+          name: 'label.volume.details',
+          actions: {
+            edit: {
+              label: 'label.edit',
+              messages: {
+                notification: function(args) {
+                  return 'Edit Shared Volume';
+                }
+              },
+              action: function (args) {
+                var params = [];
+
+                params.push("&id=" + args.context.sfSharedVolumes[0].id);
+                params.push("&size=" + args.data.size);
+                params.push("&miniops=" + args.data.miniops);
+                params.push("&maxiops=" + args.data.maxiops);
+                params.push("&burstiops=" + args.data.burstiops);
+
+                $.ajax({
+                  url: createURL('updateSolidFireVolume' + params.join("")),
+                  success: function(json) {
+                    var sfvolumeObj = json.updatesolidfirevolumeresponse.apiupdatesolidfirevolume;
+
+                    args.response.success({
+                      data: sfvolumeObj
+                    });
+                  },
+                  error: function(json) {
+                    args.response.error(parseXMLHttpResponse(json));
+                  }
+                });
+              }
+            },
+            remove: {
+              label: 'label.delete',
+              messages: {
+                confirm: function(args) {
+                  return 'Are you sure you would like to delete this shared volume?';
+                },
+                notification: function(args) {
+                  return 'Delete Shared Volume';
+                }
+              },
+              action: function(args) {
+                $.ajax({
+                  url: createURL('deleteSolidFireVolume&id=' + args.context.sfSharedVolumes[0].id),
+                  success: function(json) {
+                    args.response.success();
+                  },
+                  error: function(json) {
+                    args.response.error(parseXMLHttpResponse(json));
+                  }
+                });
+              }
+            }
+          },
+          tabs: {
+            details: {
+              title: 'label.details',
+              preFilter: function(args) {
+                var hiddenFields;
+
+                if (isAdmin()) {
+                  hiddenFields = [];
+                } else {
+                  hiddenFields = ['clustername', 'accountname'];
+                }
+
+                return hiddenFields;
+              },
+              fields: [
+                {
+                  name: {
+                    label: 'label.name'
+                  }
+                },
+                {
+                  uuid: {
+                    label: 'label.id'
+                  },
+                  clustername: {
+                    label: 'Cluster'
+                  },
+                  zonename: {
+                    label: 'label.zone'
+                  },
+                  accountname: {
+                    label: 'label.account'
+                  },
+                  vlanname: {
+                    label: 'VLAN'
+                  },
+                  size: {
+                    label: 'label.disk.size.gb',
+                    isEditable: true
+                  },
+                  miniops: {
+                    label: 'label.disk.iops.min',
+                    isEditable: true
+                  },
+                  maxiops: {
+                    label: 'label.disk.iops.max',
+                    isEditable: true
+                  },
+                  burstiops: {
+                    label: 'Burst IOPS',
+                    isEditable: true
+                  },
+                  targetportal: {
+                    label: 'Target Portal'
+                  },
+                  iqn: {
+                    label: 'IQN'
+                  },
+                  chapinitiatorusername: {
+                    label: 'Initiator Username'
+                  },
+                  chapinitiatorsecret: {
+                    label: 'Initiator Secret'
+                  },
+                  created: {
+                    label: 'label.created',
+                    converter: cloudStack.converters.toLocalDate
+                  }
+                }
+              ],
+              dataProvider: function(args) {
+                $.ajax({
+                  url: createURL("listSolidFireVolumes&id=" + args.context.sfSharedVolumes[0].id),
+                  dataType: "json",
+                  async: true,
+                  success: function(json) {
+                    var jsonObj = json.listsolidfirevolumesresponse.sfvolume[0];
+
+                    args.response.success({
+                      data: jsonObj
+                    });
+                  }
+                });
+              }
+            }
+          }
+        }
+      }
+    });
+  };
+}(cloudStack));
\ No newline at end of file